JavaScript日期对象比较


86

当比较Javascript中的日期对象时,我发现即使比较同一日期也不会返回true。

 var startDate1 = new Date("02/10/2012");
 var startDate2 = new Date("01/10/2012");
 var startDate3 = new Date("01/10/2012");
 alert(startDate1>startDate2); // true
 alert(startDate2==startDate3); //false

我如何比较这些日期的相等性?我对利用DateJS的本机对象(而不是任何第三方库)感兴趣,因为它不适合仅使用第三方JS来比较日期。


15
很好的示例说明了如何在JavaScript中对此进行不良设计。
devios1 2012年

Answers:


131

这是因为在第二种情况下,将比较实际的日期对象,并且两个对象永远不会彼此相等。强迫他们编号:

 alert( +startDate2 == +startDate3 ); // true

如果要更明确地转换为数字,请使用以下任一方法:

 alert( startDate2.getTime() == startDate3.getTime() ); // true

要么

 alert( Number(startDate2) == Number(startDate3) ); // true

哦,对规范的引用:§11.9.3在比较对象时基本上说的抽象平等比较算法obj1 == obj2仅当它们引用同一对象时才为true,否则为false。


5
@AndrewD。在这种特殊情况下使用严格等于对结果没有任何影响,这是因为示例中的equals运算符始终处理相同类型的操作数,@ RobG将值显式转换为Number(示例1和3)或在示例2中,我们知道Date.prototype.getTime将始终返回数字...
Christian C.Salvadó11年

12
仅供参考,这些方法之间存在显着的性能差异:jsperf.com/date-equality-comparison
Nick Zalutskiy 2013年

2
@Nick-即使最慢的版本也要花费不到一微秒的时间,因此尽管存在比较差异,但从绝对意义上讲,性能差异可以忽略不计。OP应该选择最适合的方法,getTime为清晰起见可能使用最合适的方法(在我测试的浏览器中碰巧也是最快的)。
RobG

2
@RobG你知道,你是绝对正确的。=)我正在编写一个库,并做了一个“ just cuz”测试。在实际软件中,它没有任何区别。
Nick Zalutskiy 2013年


24

使用getTime()从纪元返回的毫秒数(即一个数字)来比较日期:

var startDate1 = new Date("02/10/2012");
var startDate2 = new Date("01/10/2012");
var startDate3 = new Date("01/10/2012");
alert(startDate1.getTime() > startDate2.getTime()); // true
alert(startDate2.getTime() == startDate3.getTime()); //true

还可以考虑使用Date构造函数使用显式的年/月/日数字,而不是依赖字符串表示形式(请参见:Date.parse())。请记住,JavaScript中的日期始终使用客户端(浏览器)时区表示。


1
+1表示使用字符串作为Date()的参数的注释。
RobG 2011年

16

您不需要使用getTime方法-您可以从另一个日期对象中减去一个日期对象。它将返回毫秒差(负数,如果第二个是较晚的日期,则为负数)

var startDate1 = new Date("02/10/2012");
var startDate2 = new Date("01/10/2012");

var diff= (startDate1 -startDate2)

//如果日期具有相同的时间戳,则计算为0


+1简单而优雅的imo首选解决方案:它使用内置的Date评估功能,而无需强制转换为数字时间戳
gdibble

5

您可以比较实际的毫秒数:

alert(startDate2.getTime() === startDate3.getTime());

0

您还可以使用函数valueOf()

 var startDate1 = new Date("02/10/2012").valueOf();
 var startDate2 = new Date("01/10/2012").valueOf();
 var startDate3 = new Date("01/10/2012").valueOf();
 alert(startDate1>startDate2); // 1326150000000 > 1328828400000   true
 alert(startDate2==startDate3); // 1328828400000 > 1326150000000  false
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.