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来比较日期。
这是因为在第二种情况下,比较实际的日期对象,并且两个对象永远不会相互等同。强迫他们以数:
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。
我被提高了答案,但在您的示例中使用_strict equals_运算符'==='更正确吗? –
@AndrewD。在这种特殊情况下使用strict equals对结果没有任何影响,这是因为示例中的equals运算符总是处理相同类型的操作数,@ RobG将显式地将值转换为Number(示例1和3)或者在示例2中,我们知道'Date.prototype.getTime'将始终返回一个数字... – CMS
@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中的日期始终使用客户端(浏览器)时区表示。
对于使用字符串作为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,如果日期具有相同的时间戳
+1简单而优雅的imo首选解决方案:它使用内置的Date评估功能,而不需要强制转换为数字时间戳 – gdibble
的这是如何在JavaScript设计不当很好的例子。 – devios1