【问题标题】:JavaScript Date Object ComparisonJavaScript 日期对象比较
【发布时间】:2011-11-28 05:44:38
【问题描述】:

在 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

我如何比较这些日期的相等性?我有兴趣使用 JS 的原生 Date 对象而不是任何第三方库,因为它不适合使用第三方 JS 来比较日期。

【问题讨论】:

  • JavaScript 设计不佳的绝佳示例。

标签: javascript


【解决方案1】:

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

 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 只有当它们引用同一个对象时才为真,否则结果为假。

【讨论】:

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

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

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

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

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

      【讨论】:

      • +1 简单优雅,imo 首选解决方案:这使用内置日期评估功能,无需强制转换为数字时间戳
      【解决方案5】:

      使用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() 的参数。
      猜你喜欢
      • 1970-01-01
      • 2023-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-26
      相关资源
      最近更新 更多