所以我正在研究用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!");
}
答案 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。
如果您想比较日期,那么最佳做法是使用日期对象:
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;
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);
&#13;
带有正则表达式的replace
会从字符串中删除所有'-'
,'/'
和空格。
因此'2018/01/11'
变为'20180111'
而'2000-05-01'
变为'20000501'
。
这两种方法仅在日期字符串格式正确时才有效。
答案 1 :(得分:0)
当JavaScript比较两个字符串时,它会按字典顺序对它们进行比较。所以它在某些情况下有效,但通常将它用于日期是一个坏主意。