【问题标题】:Checking if two Dates have the same date info检查两个日期是否具有相同的日期信息
【发布时间】:2011-05-24 14:54:36
【问题描述】:

如何检查两个不同的日期对象是否具有相同的日期信息(具有相同的日、月、年...)?我尝试过 "=="、"===" 和 .equals,但似乎都没有。

【问题讨论】:

    标签: javascript date equality


    【解决方案1】:

    我喜欢使用这个代码

    function isEqualDate(d1, d2) {
        return (
            d1.toISOString().startsWith(d2.toISOString().substring(0,10)) 
        );
    }
    
    console.log(isEqualDate(new Date(2022,2,2,10,57), new Date(2022,2,2,11,57)) )
    
    console.log(isEqualDate(new Date(), new Date(2022,2,2)) )
    
    console.log(isEqualDate(new Date(), new Date()) )

    【讨论】:

      【解决方案2】:

      您可以使用valueOf()getTime()

      a = new Date(1995,11,17);
      b = new Date(1995,11,17);
      
      a.getTime() === b.getTime() // prints true
      

      【讨论】:

      • 因为在>= 的情况下,值将转换为数字。在== 的情况下,对象会自行比较(只有a == a 为真)。
      • 只是指出这个解决方案要求日期只包含日期部分,而很多人来这个问题可能有不同的要求(example with time parts in jsFiddle
      • 所以当使用这个时确保时间部分设置为 0 感谢setHours function:a.setHours(0,0,0,0);
      • 如果有任何毫秒差异,这将不起作用。由于getTime() 以毫秒为单位返回时间,因此这两个时间也可以有毫秒的差异。在此解决方案中,它不会按预期工作。尝试使用toDateString()
      【解决方案3】:

      为了获得更好的日期支持,请使用 moment.jsisSame 方法

      var starDate = moment('2018-03-06').startOf('day');
      var endDate  = moment('2018-04-06').startOf('day');
      
      console.log(starDate.isSame(endDate)); // false ( month is different )
      
      var starDate = moment('2018-03-06').startOf('day');
      var endDate  = moment('2018-03-06').startOf('day');
      
      console.log(starDate.isSame(endDate)); // true ( year, month and day are the same )
      

      【讨论】:

        【解决方案4】:

        一个简单的单行替代方法,用于确定两个日期是否相等,忽略时间部分:

        function isSameDate(a, b) {
            return Math.abs(a - b) < (1000 * 3600 * 24) && a.getDay() === b.getDay();
        }
        

        它确定日期 a 和 b 是否相差不超过一天并共享一周中的同一天。

        function isSameDate(a, b) {
            return Math.abs(a - b) < (1000 * 3600 * 24) && a.getDay() === b.getDay();
        }
        
        console.log(isSameDate(new Date(2017, 7, 21), new Date(2017, 7, 21))); //exact same date => true
        console.log(isSameDate(new Date(2017, 7, 21, 23, 59, 59), new Date(2017, 7, 21))); //furthest same dates => true
        console.log(isSameDate(new Date(2017, 7, 20, 23, 59, 59), new Date(2017, 7, 21))); //nearest different dates => false
        console.log(isSameDate(new Date(2016, 7, 21), new Date(2017, 7, 21))); //different year => false
        console.log(isSameDate(new Date(2017, 8, 21), new Date(2017, 7, 21))); //different month => false

        【讨论】:

          【解决方案5】:

          如果您只想检查日期是否在同一天而不考虑时间,那么您可以使用toDateString() method 进行比较。此方法只返回没有时间的日期:

          var start = new Date('2015-01-28T10:00:00Z');
          var end = new Date('2015-01-28T18:00:00Z');
          
          if (start.toDateString() === end.toDateString()) {
            // Same day - maybe different times
          } else {
            // Different day
          }
          

          【讨论】:

            【解决方案6】:

            我使用了这个代码:

            Date.prototype.isSameDateAs = function(pDate) {
              return (
                this.getFullYear() === pDate.getFullYear() &&
                this.getMonth() === pDate.getMonth() &&
                this.getDate() === pDate.getDate()
              );
            }
            

            那你就这样称呼它:if (aDate.isSameDateAs(otherDate)) { ... }

            【讨论】:

            • 当您只能使用两次 getTime() 时,为什么还要运行十几个函数?哦,您是否考虑忽略小时、月份和年份的差异?在那种情况下,时区的考虑可能开始变得重要了?
            • 因为问题是“两个不同的日期对象具有相同的日期信息”,而这段代码就是这样做的:比较日期而不考虑时间
            • 呃,我的意思是“忽略小时、分钟和秒的差异”
            • 根据准确的问题,这其实是正确的答案,不过,“日期信息”可以被认为是模棱两可的。
            【解决方案7】:

            类型转换为整数:

            a = new Date(1995,11,17);
            b = new Date(1995,11,17);
            +a === +b;  //true
            

            【讨论】:

            • 一元运算符的绝妙使用
            【解决方案8】:

            减去它们并与零比较:

            var date1 = new Date();
            var date2 = new Date();
            

            // 对日期做一些事情...

            (date1 - date2) ? alert("not equal") : alert("equal");
            

            将其放入变量中:

            var datesAreSame = !(date1 - date2);
            

            【讨论】:

              【解决方案9】:

              地狱,

              您可以尝试(请原谅函数名称 :) - 根据 felix 的 valueof 而不是 getTime 进行修改)

              function isEqual(startDate, endDate) {
                  return endDate.valueOf() == startDate.valueOf();
              }
              

              用法:

              if(isEqual(date1, date2)){
                 // do something
              }
              

              可能会让你在那儿走上一段路。

              另见:

              'http://www.java2s.com/Tutorial/JavaScript/0240__Date/DatevalueOf.htm'

              【讨论】:

                猜你喜欢
                • 2014-06-28
                • 2021-03-06
                • 1970-01-01
                • 1970-01-01
                • 2021-12-22
                • 2018-02-01
                • 2022-01-12
                相关资源
                最近更新 更多