【问题标题】:Difference between dates in JavaScriptJavaScript中日期之间的差异
【发布时间】:2009-12-28 06:02:22
【问题描述】:

如何找出两个日期之间的差异?

【问题讨论】:

标签: javascript datetime datediff


【解决方案1】:

通过使用Date 对象及其毫秒值,可以计算出差异:

var a = new Date(); // Current date now.
var b = new Date(2010, 0, 1, 0, 0, 0, 0); // Start of 2010.
var d = (b-a); // Difference in milliseconds.

您可以通过将毫秒除以 1000 以将其转换为秒,然后将结果转换为整数(这将删除表示毫秒的小数部分)来获得秒数(作为整数/整数):

var seconds = parseInt((b-a)/1000);

然后您可以通过将seconds 除以 60 并将其转换为整数来获得完整的 minutes,然后通过将 minutes 除以 60 并将其转换为整数来获得 hours,然后在相同的时间单位内获得更长的时间单位方式。由此,可以创建一个函数,以获取一个时间单位的最大总量,其中一个较低单位的值和剩余的较低单位的值:

function get_whole_values(base_value, time_fractions) {
    time_data = [base_value];
    for (i = 0; i < time_fractions.length; i++) {
        time_data.push(parseInt(time_data[i]/time_fractions[i]));
        time_data[i] = time_data[i] % time_fractions[i];
    }; return time_data;
};
// Input parameters below: base value of 72000 milliseconds, time fractions are
// 1000 (amount of milliseconds in a second) and 60 (amount of seconds in a minute). 
console.log(get_whole_values(72000, [1000, 60]));
// -> [0,12,1] # 0 whole milliseconds, 12 whole seconds, 1 whole minute.

如果您想知道上面为第二个 Date object 提供的输入参数是什么,请参阅下面的名称:

new Date(<year>, <month>, <day>, <hours>, <minutes>, <seconds>, <milliseconds>);

正如该解决方案的 cmets 中所述,您不一定需要提供所有这些值,除非它们对于您希望表示的日期是必需的。

【讨论】:

  • Date构造函数不需要带所有参数调用,可以只带Year和Month调用,其他参数可选。
  • 谢谢,CMS。我想确保用户理解他们可以非常详细地了解他们的规范。
  • 我已更新解决方案以传达您的观点,CMS。感谢您的提醒。
  • 不客气,乔纳森,感谢您的编辑...还请注意,b 实际上是 2009-12-31,因为 0 被用作日期参数,它可以是不知何故让新人感到困惑......
  • 啊,好眼力,CMS。如果我没记错的话,月份是从零开始的。确实有点混乱。
【解决方案2】:

我找到了这个,它对我来说很好用:

计算两个已知日期之间的差异

不幸的是,计算两个已知日期之间的日期间隔(例如天、周或月)并不容易,因为您不能只将 Date 对象相加。为了在任何类型的计算中使用 Date 对象,我们必须首先检索 Date 的内部毫秒值,该值存储为一个大整数。执行此操作的函数是 Date.getTime()。一旦两个日期都被转换,从前面的日期中减去后面的日期返回以毫秒为单位的差异。然后可以通过将该数字除以相应的毫秒数来确定所需的时间间隔。例如,要获得给定毫秒数的天数,我们将除以 86,400,000,即一天中的毫秒数(1000 x 60 秒 x 60 分钟 x 24 小时):

Date.daysBetween = function( date1, date2 ) {
  //Get 1 day in milliseconds
  var one_day=1000*60*60*24;

  // Convert both dates to milliseconds
  var date1_ms = date1.getTime();
  var date2_ms = date2.getTime();

  // Calculate the difference in milliseconds
  var difference_ms = date2_ms - date1_ms;

  // Convert back to days and return
  return Math.round(difference_ms/one_day); 
}

//Set the two dates
var y2k  = new Date(2000, 0, 1); 
var Jan1st2010 = new Date(y2k.getFullYear() + 10, y2k.getMonth(), y2k.getDate());
var today= new Date();
//displays 726
console.log( 'Days since ' 
           + Jan1st2010.toLocaleDateString() + ': ' 
           + Date.daysBetween(Jan1st2010, today));

四舍五入是可选的,具体取决于您是否需要部分天数。

Reference

【讨论】:

    【解决方案3】:
        // This is for first date
        first = new Date(2010, 03, 08, 15, 30, 10); // Get the first date epoch object
        document.write((first.getTime())/1000); // get the actual epoch values
        second = new Date(2012, 03, 08, 15, 30, 10); // Get the first date epoch object
        document.write((second.getTime())/1000); // get the actual epoch values
        diff= second - first ;
        one_day_epoch = 24*60*60 ;  // calculating one epoch
        if ( diff/ one_day_epoch > 365 ) // check , is it exceei
        {
        alert( 'date is exceeding one year');
        }
    

    【讨论】:

      【解决方案4】:

      如果您正在寻找以年、月和日的组合表示的差异,我建议使用此函数:

      function interval(date1, date2) {
          if (date1 > date2) { // swap
              var result = interval(date2, date1);
              result.years  = -result.years;
              result.months = -result.months;
              result.days   = -result.days;
              result.hours  = -result.hours;
              return result;
          }
          result = {
              years:  date2.getYear()  - date1.getYear(),
              months: date2.getMonth() - date1.getMonth(),
              days:   date2.getDate()  - date1.getDate(),
              hours:  date2.getHours() - date1.getHours()
          };
          if (result.hours < 0) {
              result.days--;
              result.hours += 24;
          }
          if (result.days < 0) {
              result.months--;
              // days = days left in date1's month, 
              //   plus days that have passed in date2's month
              var copy1 = new Date(date1.getTime());
              copy1.setDate(32);
              result.days = 32-date1.getDate()-copy1.getDate()+date2.getDate();
          }
          if (result.months < 0) {
              result.years--;
              result.months+=12;
          }
          return result;
      }
      
      // Be aware that the month argument is zero-based (January = 0)
      var date1 = new Date(2015, 4-1, 6);
      var date2 = new Date(2015, 5-1, 9);
      
      document.write(JSON.stringify(interval(date1, date2)));

      此解决方案将以我们自然会做的方式处理闰年(2 月 29 日)和月份长度差异(我认为)。

      因此,例如,2015 年 2 月 28 日和 2015 年 3 月 28 日之间的时间间隔将被视为正好 1 个月,而不是 28 天。如果这两天都在 2016 年,那么差异仍然是 1 个月,而不是 29 天。

      具有完全相同的月份和日期,但年份不同的日期,总是会有一个确切的年数的差异。因此 2015-03-01 和 2016-03-01 之间的差异将恰好是 1 年,而不是 1 年 1 天(因为将 365 天计算为 1 年)。

      【讨论】:

        【解决方案5】:

        这个答案基于另一个答案(最后的链接),是关于两个日期之间的差异。
        您可以看到它是如何工作的,因为它很简单,还包括将差异拆分为
        时间单位(我制作的一个函数)并转换为 UTC 以解决时区问题。

        function date_units_diff(a, b, unit_amounts) {
            var split_to_whole_units = function (milliseconds, unit_amounts) {
                // unit_amounts = list/array of amounts of milliseconds in a
                // second, seconds in a minute, etc., for example "[1000, 60]".
                time_data = [milliseconds];
                for (i = 0; i < unit_amounts.length; i++) {
                    time_data.push(parseInt(time_data[i] / unit_amounts[i]));
                    time_data[i] = time_data[i] % unit_amounts[i];
                }; return time_data.reverse();
            }; if (unit_amounts == undefined) {
                unit_amounts = [1000, 60, 60, 24];
            };
            var utc_a = new Date(a.toUTCString());
            var utc_b = new Date(b.toUTCString());
            var diff = (utc_b - utc_a);
            return split_to_whole_units(diff, unit_amounts);
        }
        
        // Example of use:
        var d = date_units_diff(new Date(2010, 0, 1, 0, 0, 0, 0), new Date()).slice(0,-2);
        document.write("In difference: 0 days, 1 hours, 2 minutes.".replace(
           /0|1|2/g, function (x) {return String( d[Number(x)] );} ));

        我上面的代码是如何工作的

        可以使用Date 对象计算以毫秒为单位的日期/时间差:

        var a = new Date(); // Current date now.
        var b = new Date(2010, 0, 1, 0, 0, 0, 0); // Start of 2010.
        
        var utc_a = new Date(a.toUTCString());
        var utc_b = new Date(b.toUTCString());
        var diff = (utc_b - utc_a); // The difference as milliseconds.
        

        然后计算出该差的秒数,将其除以 1000 进行转换
        毫秒到秒,然后将结果更改为整数(整数)以删除
        毫秒(小数部分):var seconds = parseInt(diff/1000).
        此外,我可以使用相同的过程获得更长的时间单位,例如:
        - (整数)分钟,将除以60并将结果更改为整数,
        - 小时,将分钟除以60并将结果更改为整数。

        我创建了一个函数来执行将差异拆分为的过程
        整个时间单位,命名为split_to_whole_units,带有这个演示:

        console.log(split_to_whole_units(72000, [1000, 60]));
        // -> [1,12,0] # 1 (whole) minute, 12 seconds, 0 milliseconds.
        

        此答案基于this other one

        【讨论】:

        【解决方案6】:

        你也可以使用它

        export function diffDateAndToString(small: Date, big: Date) {
        
        
            // To calculate the time difference of two dates 
            const Difference_In_Time = big.getTime() - small.getTime()
        
            // To calculate the no. of days between two dates 
            const Days = Difference_In_Time / (1000 * 3600 * 24)
            const Mins = Difference_In_Time / (60 * 1000)
            const Hours = Mins / 60
        
            const diffDate = new Date(Difference_In_Time)
        
            console.log({ date: small, now: big, diffDate, Difference_In_Days: Days, Difference_In_Mins: Mins, Difference_In_Hours: Hours })
        
            var result = ''
        
            if (Mins < 60) {
                result = Mins + 'm'
            } else if (Hours < 24) result = diffDate.getMinutes() + 'h'
            else result = Days + 'd'
            return { result, Days, Mins, Hours }
        }
        

        结果 { result: '30d', Days: 30, Mins: 43200, Hours: 720 }

        【讨论】:

          【解决方案7】:
          Date.prototype.addDays = function(days) {
          
             var dat = new Date(this.valueOf())
             dat.setDate(dat.getDate() + days);
             return dat;
          }
          
          function getDates(startDate, stopDate) {
          
            var dateArray = new Array();
            var currentDate = startDate;
            while (currentDate <= stopDate) {
              dateArray.push(currentDate);
              currentDate = currentDate.addDays(1);
            }
            return dateArray;
          }
          
          var dateArray = getDates(new Date(), (new Date().addDays(7)));
          
          for (i = 0; i < dateArray.length; i ++ ) {
            //  alert (dateArray[i]);
          
              date=('0'+dateArray[i].getDate()).slice(-2);
              month=('0' +(dateArray[i].getMonth()+1)).slice(-2);
              year=dateArray[i].getFullYear();
              alert(date+"-"+month+"-"+year );
          }
          

          【讨论】:

            【解决方案8】:
            var DateDiff = function(type, start, end) {
            
                let // or var
                    years = end.getFullYear() - start.getFullYear(),
                    monthsStart = start.getMonth(),
                    monthsEnd = end.getMonth()
                ;
            
                var returns = -1;
            
                switch(type){
                    case 'm': case 'mm': case 'month': case 'months':
                        returns = ( ( ( years * 12 ) - ( 12 - monthsEnd ) ) + ( 12 - monthsStart ) );
                        break;
                    case 'y': case 'yy': case 'year': case 'years':
                        returns = years;
                        break;
                    case 'd': case 'dd': case 'day': case 'days':
                        returns = ( ( end - start ) / ( 1000 * 60 * 60 * 24 ) );
                        break;
                }
            
                return returns;
            
            }
            

            用法

            var qtMonths = DateDiff('mm', new Date('2015-05-05'), new Date());

            var qtYears = DateDiff('yy', new Date('2015-05-05'), new Date());

            var qtDays = DateDiff('dd', new Date('2015-05-05'), new Date());

            var qtMonths = DateDiff('m', new Date('2015-05-05'), new Date()); // 米 ||是|| d

            var qtMonths = DateDiff('month', new Date('2015-05-05'), new Date()); // 月 ||年份 ||天

            var qtMonths = DateDiff('months', new Date('2015-05-05'), new Date()); // 月 ||年||天

            ...

            var DateDiff = function (type, start, end) {
            
                let // or var
                    years = end.getFullYear() - start.getFullYear(),
                    monthsStart = start.getMonth(),
                    monthsEnd = end.getMonth()
                ;
            
                if(['m', 'mm', 'month', 'months'].includes(type)/*ES6*/)
                    return ( ( ( years * 12 ) - ( 12 - monthsEnd ) ) + ( 12 - monthsStart ) );
                else if(['y', 'yy', 'year', 'years'].includes(type))
                    return years;
                else if (['d', 'dd', 'day', 'days'].indexOf(type) !== -1/*EARLIER JAVASCRIPT VERSIONS*/)
                    return ( ( end - start ) / ( 1000 * 60 * 60 * 24 ) );
                else
                    return -1;
            
            }
            

            【讨论】:

              猜你喜欢
              • 2015-09-14
              • 1970-01-01
              • 2011-02-01
              • 2013-07-17
              • 2013-02-01
              • 2017-06-27
              • 1970-01-01
              相关资源
              最近更新 更多