JavaScript日期对象比较

问题描述:

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

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 

我怎么能比较这些日期的平等?我有兴趣使用JS的本地对象Date,而不是任何第三方库,因为它不适合使用第三方JS来比较日期。

+8

的这是如何在JavaScript设计不当很好的例子。 – devios1

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

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

如果你想要一个更明确地转换为数字,请使用:

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

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

哦,规范的引用:§11.9 .3 The Abstract Equality Comparison Algorithm基本上说比较对象时,obj1 == obj2只有当它们指向同一个对象时才为真,否则结果为false。

+0

我被提高了答案,但在您的示例中使用_strict equals_运算符'==='更正确吗? –

+5

@AndrewD。在这种特殊情况下使用strict equals对结果没有任何影响,这是因为示例中的equals运算符总是处理相同类型的操作数,@ RobG将显式地将值转换为Number(示例1和3)或者在示例2中,我们知道'Date.prototype.getTime'将始终返回一个数字... – CMS

+0

@RobG:当您说“obj1 == obj2'仅当它们引用同一对象时才为true “,这是否意味着比较(如果两个操作数都是对象)不会测试平等,而是测试身份?我的理解是正确的吗? –

比较使用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

对于使用字符串作为Date()的参数的注释+1。 – RobG

你可以比较实际的毫秒:

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

你并不需要使用的getTime方法 - 你可以从另一个日期对象减去一个日期对象。这将返回毫秒差(负,如果第二个是较后日期)

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

var diff= (startDate1 -startDate2) 

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

+0

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