JavaScript 日期对象比较

IT技术 javascript
2021-01-13 08:31:27

在 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 来比较日期是不合适的。

5个回答

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

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

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

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

或者

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

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

2021-03-15 08:31:27
仅供参考,这些方法之间存在显着的性能差异:jsperf.com/date-equality-comparison
2021-03-18 08:31:27
@安德鲁D。在这种特殊情况下使用严格等于不会对结果产生任何影响,这是因为示例中的等于运算符始终处理相同类型的操作数,@RobG 将值显式转换为数字(示例 1 和3) 或者在示例 2 中,我们知道Date.prototype.getTime将始终返回一个数字...
2021-03-23 08:31:27
@Nick——即使是最慢的版本也需要不到一微秒的时间来运行,因此虽然存在比较差异,但绝对而言,性能差异可以忽略不计。OP 应该选择最适合的方法,getTime为了清晰起见,可能使用最好(并且在我测试的浏览器中也是最快的)。
2021-03-24 08:31:27
@RobG 你知道,你是绝对正确的。=) 我正在编写一个库并“只是因为”做了一个测试。在真正的软件中,它没有任何区别。
2021-04-06 08:31:27

使用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() 参数的评论。
2021-04-08 08:31:27

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

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

var diff= (startDate1 -startDate2)

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

+1 简单优雅,imo 首选解决方案:这使用内置日期评估功能,无需强制转换为数字时间戳
2021-03-16 08:31:27

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

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

您还可以使用函数 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