Javascript字符串如何与日期进行比较?

时间:2018-02-01 14:54:50

标签: javascript date datetime

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

参考:

how to compare two string dates in javascript?

Compare two dates with JavaScript

然而,跟随codepen后面的{{3}}完全正如您所期望的那样只有字符串,它甚至可以在其中一个是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!");
}

2 个答案:

答案 0 :(得分: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值低于"/"。< / p>

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

一旦找到差异,表明哪个字符串大于另一个字符串。

实施例

字符串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。

与日期对象比较

如果您想比较日期,那么最佳做法是使用日期对象:

&#13;
&#13;
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);
&#13;
&#13;
&#13;

Date.parse()会将格式正确的日期字符串转换为日期对象,然后比较日期的整数表示形式,从而得到准确的结果。

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

比较没有日期对象

如果您不想使用日期对象,那么您需要摆脱分隔符以仅比较数字。但是,如果日期对象的月份和日期并不总是两位数,则可能无效。

&#13;
&#13;
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);
&#13;
&#13;
&#13;

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

因此'2018/01/11'变为'20180111''2000-05-01'变为'20000501'

  

这两种方法仅在日期字符串格式正确时才有效。

答案 1 :(得分:0)

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