【问题标题】:How does Javascript string compare work with dates?Javascript 字符串如何与日期进行比较?
【发布时间】:2018-07-11 22:46:17
【问题描述】:

所以我正在考虑用 javascript 中的字符串进行日期比较,我发现大量堆栈溢出帖子说你不能这样做。

参考:

how to compare two string dates in javascript?

Compare two dates with JavaScript

但是,codepen 之后的这个工作完全符合您对字符串的预期,即使其中一个是 YYYY-MM-DD 而另一个是 YYYY/MM/DD 时也可以工作。任何人都可以解释为什么这有效以及为什么堆栈溢出和其他网站上的几乎每个人都建议您制作日期对象?看起来开销很大

var bigger = "2017-01-01";
var smaller = "2000/01/01";
var biggest = "2018-01-01"
if (bigger > smaller ){
  console.log("logical!");
}

if (smaller > bigger ){
  console.log("illogical!");
}

if (bigger > biggest ){
  console.log("illogical!");
}

if (biggest > smaller ){
  console.log("logical!");
}

【问题讨论】:

  • 谨慎使用不同分隔符的假设:"2000/01/01" > "2000-01-13" 给出true

标签: javascript date datetime


【解决方案1】:

字符串总是逐个字符比较。

var bigger = "2017-01-01";
var smaller = "2000/01/01";

console.log(`'${bigger}' > '${smaller}'`, bigger > smaller);

bigger = "2000-12-01";
console.log(`'${bigger}' > '${smaller}'`, bigger > smaller);

当我们将此"2000-12-01" 与此"2000/01/01" 进行比较时,似乎它失败了。但是比较匹配前四个字符'2000',然后比较第五个"/""-""-" 的 ASCII 值比"/" 低。

字符串比较必须逐个检查每个字符,直到发现差异。如果它没有发现任何差异,那么字符串是相同的。

一旦发现差异表明哪个字符串大于另一个。

示例:

字符串 1:"My dog howels"

字符串 2:"My dog barks"

代码检查每个字符,直到发现不同:

Position 0: "M" vs "M" - 相同

Position 1: "y" vs "y" - 相同

Position 2: " " vs " " - 相同

Position 3: "d" vs "d" - 相同

Position 4: "o" vs "o" - 相同

Position 5: "g" vs "g" - 相同

Position 6: " " vs " " - 相同

Position 7: "h" vs "b" - "h" 大于 "b"

所以字符串 1 大于字符串 2。


与日期对象比较

如果你想比较日期,最好使用日期对象:

var bigger = Date.parse("2017-01-01");
var smaller = Date.parse("2000/01/01");

console.log(`'${bigger}' > '${smaller}'`, bigger > smaller);

bigger = Date.parse("2000-12-01");
console.log(`'${bigger}' > '${smaller}'`, bigger > smaller);

Date.parse() 会将您正确格式化的日期字符串转换为日期对象,然后比较日期的整数表示,给出准确的结果。

Date 对象将所有日期存储为数字,并且数字必须更快地进行比较。


比较没有日期对象

如果您不想使用日期对象,那么您需要去掉分隔符来仅比较数字。但是,如果您的日期对象并不总是两位数的月份和日期,这可能不起作用。

function fixDate(dateStr) {
  return dateStr.replace(/[\/\-\s]/g, '');
}

var bigger = fixDate("2017-01-01");
var smaller = fixDate("2000/01/01");

console.log(`'${bigger}' > '${smaller}'`, bigger > smaller);

bigger = fixDate("2000-12-01");
console.log(`'${bigger}' > '${smaller}'`, bigger > smaller);

带有正则表达式的replace 会删除字符串中的所有'-''/' 和空格。

所以'2018/01/11' 变成'20180111''2000-05-01' 变成'20000501'

只有在日期字符串格式正确的情况下,这两种方法才有效。

【讨论】:

    【解决方案2】:

    当 JavaScript 比较两个字符串时,它会按字典顺序比较它们。所以它在某些情况下有效,但通常将它用于日期是一个坏主意。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多