JavaScript日期对象比较

Har*_*ana 79 javascript

在比较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
Run Code Online (Sandbox Code Playgroud)

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

Rob*_*obG 124

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

 alert( +startDate2 == +startDate3 ); // true
Run Code Online (Sandbox Code Playgroud)

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

 alert( startDate2.getTime() == startDate3.getTime() ); // true
Run Code Online (Sandbox Code Playgroud)

要么

 alert( Number(startDate2) == Number(startDate3) ); // true
Run Code Online (Sandbox Code Playgroud)

哦,对规范的引用:§11.9.3 抽象等式比较算法基本上说在比较对象时,obj1 == obj2只有当它们引用同一个对象时才是真的,否则结果是假的.

  • 仅供参考,这些方法之间存在显着的性能差异:http://jsperf.com/date-equality-comparison (11认同)
  • @AndrewD.在这种特殊情况下使用strict equals对结果没有任何影响,这是因为示例中的equals运算符总是处理相同类型的操作数,@ RobG将值显式转换为Number(例1和3)或者在示例2中,我们知道`Date.prototype.getTime`将始终返回一个Number ... (5认同)
  • @Nick——即使是最慢的版本也需要不到一微秒的时间来运行,因此虽然存在比较差异,但绝对而言,性能差异可以忽略不计。OP 应该选择最适合的方法,可能使用 `getTime` 是最好的清晰度(并且在我测试的浏览器中也是最快的)。 (2认同)
  • @RobG你知道,你是绝对正确的.=)我正在写一个库并做了一个测试"只是因为." 在真实的软件中,它没有任何区别. (2认同)

Tom*_*icz 21

使用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
Run Code Online (Sandbox Code Playgroud)

还要考虑使用Date构造函数获取显式的年/月/日期编号,而不是依赖于字符串表示(请参阅:Date.parse()).请记住,JavaScript中的日期始终使用客户端(浏览器)时区来表示.


ken*_*bec 13

您不需要使用getTime方法 - 您可以从另一个日期对象中减去日期对象.它将返回毫秒差异(否定,如果第二个是更晚的日期)

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

var diff= (startDate1 -startDate2)
Run Code Online (Sandbox Code Playgroud)

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


gio*_*_13 5

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

alert(startDate2.getTime() === startDate3.getTime());
Run Code Online (Sandbox Code Playgroud)