如何计算javascript中的日期差异

Far*_*qui 162 javascript datetime

我想计算日期,小时,分钟,秒,毫秒,纳秒的日期差异,我该怎么办?请建议.

ick*_*fay 198

假设你有两个Date对象,你可以减去它们以得到毫秒的差异:

var difference = date2 - date1;
Run Code Online (Sandbox Code Playgroud)

从那里,您可以使用简单的算法来导出其他值.

  • 这是正确的答案.例如:为了获得数天的差异,请执行`Math.floor((date2 - date1)/(1000*60*60*24))` - 对于任何其他单位的差异,调整分母(基值以ms为单位) . (37认同)
  • 没有用于将毫秒转换为年的"简单"算法.你必须知道bissextile年份,时区,有些日子有23或25小时.有些年份有365,25天,所以这里没有简单的算法(仍在寻找准确的解决方案). (28认同)
  • @ trisweb-即使是在日常生活中变得简单的事情也比你的评论更复杂.周二晚上10点到周三早上9点多少天?你的算法说0.其他人可能会想1. (11认同)
  • @Alexandre:这个问题从未问过多年.实际上,计算年份差异并不重要.然而,几天来,这是正确的,假设日期在同一时区(一个不合理的假设).据我所知,一天被定义为24小时,由于夏令时而导致的任何"变化"实际上都是时区的转换.如果你没有区分时区,那么试图找出时差就会让你处于一个受伤的世界,尤其是因为DST切换"重复"时间.但是,保持在一个时区,这一切都有效. (5认同)
  • @RobG 相对主义者甚至可能认为大于 1 或小于 0。这一切都取决于观察者。 (2认同)

Par*_*ani 72

var DateDiff = {

    inDays: function(d1, d2) {
        var t2 = d2.getTime();
        var t1 = d1.getTime();

        return parseInt((t2-t1)/(24*3600*1000));
    },

    inWeeks: function(d1, d2) {
        var t2 = d2.getTime();
        var t1 = d1.getTime();

        return parseInt((t2-t1)/(24*3600*1000*7));
    },

    inMonths: function(d1, d2) {
        var d1Y = d1.getFullYear();
        var d2Y = d2.getFullYear();
        var d1M = d1.getMonth();
        var d2M = d2.getMonth();

        return (d2M+12*d2Y)-(d1M+12*d1Y);
    },

    inYears: function(d1, d2) {
        return d2.getFullYear()-d1.getFullYear();
    }
}

var dString = "May, 20, 1984";

var d1 = new Date(dString);
var d2 = new Date();

document.write("<br />Number of <b>days</b> since "+dString+": "+DateDiff.inDays(d1, d2));
document.write("<br />Number of <b>weeks</b> since "+dString+": "+DateDiff.inWeeks(d1, d2));
document.write("<br />Number of <b>months</b> since "+dString+": "+DateDiff.inMonths(d1, d2));
document.write("<br />Number of <b>years</b> since "+dString+": "+DateDiff.inYears(d1, d2));
Run Code Online (Sandbox Code Playgroud)

代码示例取自此处.

  • 又好又简单 (3认同)

Mur*_*rlu 27

另一个解决方案是将差异转换为新的Date对象并获取该日期的年份(1970年的差异),月,日等.

var date1 = new Date(2010, 6, 17);
var date2 = new Date(2013, 12, 18);
var diff = new Date(date2.getTime() - date1.getTime());
// diff is: Thu Jul 05 1973 04:00:00 GMT+0300 (EEST)

console.log(diff.getUTCFullYear() - 1970); // Gives difference as year
// 3

console.log(diff.getUTCMonth()); // Gives month count of difference
// 6

console.log(diff.getUTCDate() - 1); // Gives day count of difference
// 4
Run Code Online (Sandbox Code Playgroud)

所以差异就像"3年6个月4天".如果你想在人类可读的风格上有所不同,那可以帮助你.

  • 这不可靠.它没有考虑到不同的月份长度,或闰年和其他异常情况. (4认同)
  • @ chaim.dev"如果你想在人类可读的风格上有所不同,那可以帮助你." (3认同)
  • 谢谢 Murat,这个解决方案解决了我的问题。我真正想要的是它必须以与 php 相同的方式工作。 (2认同)

Rob*_*obG 24

像"天差"这样的表达从来就不像看起来那么简单.如果您有以下日期:

d1: 2011-10-15 23:59:00
d1: 2011-10-16 00:01:00
Run Code Online (Sandbox Code Playgroud)

如果"天数差异"为1或0,则时间差异为2分钟?类似的问题出现在几个月,几年或其他任何表达的差异,因为年,月和日具有不同的长度和不同的时间(例如,夏令时开始的日子比通常短1小时,比那天短2小时)它结束了).

这是一个忽略时间的天数差异的函数,即上述日期返回1.

/*
   Get the number of days between two dates - not inclusive.

   "between" does not include the start date, so days
   between Thursday and Friday is one, Thursday to Saturday
   is two, and so on. Between Friday and the following Friday is 7.

   e.g. getDaysBetweenDates( 22-Jul-2011, 29-jul-2011) => 7.

   If want inclusive dates (e.g. leave from 1/1/2011 to 30/1/2011),
   use date prior to start date (i.e. 31/12/2010 to 30/1/2011).

   Only calculates whole days.

   Assumes d0 <= d1
*/
function getDaysBetweenDates(d0, d1) {

  var msPerDay = 8.64e7;

  // Copy dates so don't mess them up
  var x0 = new Date(d0);
  var x1 = new Date(d1);

  // Set to noon - avoid DST errors
  x0.setHours(12,0,0);
  x1.setHours(12,0,0);

  // Round to remove daylight saving errors
  return Math.round( (x1 - x0) / msPerDay );
}
Run Code Online (Sandbox Code Playgroud)

这可以更简洁:

/*  Return number of days between d0 and d1.
**  Returns positive if d0 < d1, otherwise negative.
**
**  e.g. between 2000-02-28 and 2001-02-28 there are 366 days
**       between 2015-12-28 and 2015-12-29 there is 1 day
**       between 2015-12-28 23:59:59 and 2015-12-29 00:00:01 there is 1 day
**       between 2015-12-28 00:00:01 and 2015-12-28 23:59:59 there are 0 days
**        
**  @param {Date} d0  - start date
**  @param {Date} d1  - end date
**  @returns {number} - whole number of days between d0 and d1
**
*/
function daysDifference(d0, d1) {
  var diff = new Date(+d1).setHours(12) - new Date(+d0).setHours(12);
  return Math.round(diff/8.64e7);
}

// Simple formatter
function formatDate(date){
  return [date.getFullYear(),('0'+(date.getMonth()+1)).slice(-2),('0'+date.getDate()).slice(-2)].join('-');
}

// Examples
[[new Date(2000,1,28), new Date(2001,1,28)],  // Leap year
 [new Date(2001,1,28), new Date(2002,1,28)],  // Not leap year
 [new Date(2017,0,1),  new Date(2017,1,1)] 
].forEach(function(dates) {
  document.write('From ' + formatDate(dates[0]) + ' to ' + formatDate(dates[1]) +
                 ' is ' + daysDifference(dates[0],dates[1]) + ' days<br>');
});
Run Code Online (Sandbox Code Playgroud)


小智 18

<html lang="en">
<head>
<script>
function getDateDiff(time1, time2) {
  var str1= time1.split('/');
  var str2= time2.split('/');

  //                yyyy   , mm       , dd
  var t1 = new Date(str1[2], str1[0]-1, str1[1]);
  var t2 = new Date(str2[2], str2[0]-1, str2[1]);

  var diffMS = t1 - t2;    
  console.log(diffMS + ' ms');

  var diffS = diffMS / 1000;    
  console.log(diffS + ' ');

  var diffM = diffS / 60;
  console.log(diffM + ' minutes');

  var diffH = diffM / 60;
  console.log(diffH + ' hours');

  var diffD = diffH / 24;
  console.log(diffD + ' days');
  alert(diffD);
}

//alert(getDateDiff('10/18/2013','10/14/2013'));
</script>
</head>
<body>
  <input type="button" 
       onclick="getDateDiff('10/18/2013','10/14/2013')" 
       value="clickHere()" />

</body>
</html>
Run Code Online (Sandbox Code Playgroud)


小智 9

使用Moment.js进行所有与JavaScript相关的日期时间计算

回答你的问题是:

var a = moment([2007, 0, 29]);   
var b = moment([2007, 0, 28]);    
a.diff(b) // 86400000  
Run Code Online (Sandbox Code Playgroud)

完整的细节可以在这里找到

  • @RomeoMihalcea 当前具有一种语言环境的缩小版 moment.js 2.22.2 为 53 KB,gzip 后为 17 KB。不过我理解你的担忧。对于一个简单的函数来说,这是一个巨大的库,但它可以处理许多与日期/时间相关的怪癖,因此通常是值得的。 (4认同)
  • 并拥抱额外的400+ Kb,仅差一点日期。 (3认同)

小智 7

function DateDiff(date1, date2) {
    date1.setHours(0);
    date1.setMinutes(0, 0, 0);
    date2.setHours(0);
    date2.setMinutes(0, 0, 0);
    var datediff = Math.abs(date1.getTime() - date2.getTime()); // difference 
    return parseInt(datediff / (24 * 60 * 60 * 1000), 10); //Convert values days and return value      
}
Run Code Online (Sandbox Code Playgroud)


小智 7

使用momentjs很简单:

moment("2016-04-08").fromNow();
Run Code Online (Sandbox Code Playgroud)


use*_*363 7

添加到@paresh mayani 的答案中,像 Facebook 一样工作 - 显示以秒/分钟/小时/周/月/年为单位过去了多少时间

var DateDiff = {

  inSeconds: function(d1, d2) {
        var t2 = d2.getTime();
        var t1 = d1.getTime();

        return parseInt((t2-t1)/1000);
    },


  inMinutes: function(d1, d2) {
        var t2 = d2.getTime();
        var t1 = d1.getTime();

        return parseInt((t2-t1)/60000);
    },

  inHours: function(d1, d2) {
        var t2 = d2.getTime();
        var t1 = d1.getTime();

        return parseInt((t2-t1)/3600000);
    },

    inDays: function(d1, d2) {
        var t2 = d2.getTime();
        var t1 = d1.getTime();

        return parseInt((t2-t1)/(24*3600*1000));
    },

    inWeeks: function(d1, d2) {
        var t2 = d2.getTime();
        var t1 = d1.getTime();

        return parseInt((t2-t1)/(24*3600*1000*7));
    },

    inMonths: function(d1, d2) {
        var d1Y = d1.getFullYear();
        var d2Y = d2.getFullYear();
        var d1M = d1.getMonth();
        var d2M = d2.getMonth();

        return (d2M+12*d2Y)-(d1M+12*d1Y);
    },

    inYears: function(d1, d2) {
        return d2.getFullYear()-d1.getFullYear();
    }
}







    var dString = "May, 20, 1984"; //will also get (Y-m-d H:i:s)
    
    var d1 = new Date(dString);
    var d2 = new Date();
    
    var timeLaps = DateDiff.inSeconds(d1, d2);
    var dateOutput = "";
    
    
    if (timeLaps<60)
    {
      dateOutput = timeLaps+" seconds";
    }
    else  
    {
      timeLaps = DateDiff.inMinutes(d1, d2);
      if (timeLaps<60)
      {
        dateOutput = timeLaps+" minutes";
      }
      else
      {
        timeLaps = DateDiff.inHours(d1, d2);
        if (timeLaps<24)
        {
          dateOutput = timeLaps+" hours";
        }
        else
        {
            timeLaps = DateDiff.inDays(d1, d2);
            if (timeLaps<7)
            {
              dateOutput = timeLaps+" days";
            }
            else
            {
                timeLaps = DateDiff.inWeeks(d1, d2);
                if (timeLaps<4)
                {
                  dateOutput = timeLaps+" weeks";
                }
                else
                {
                    timeLaps = DateDiff.inMonths(d1, d2);
                    if (timeLaps<12)
                    {
                      dateOutput = timeLaps+" months";
                    }
                    else
                    {
                      timeLaps = DateDiff.inYears(d1, d2);
                      dateOutput = timeLaps+" years";
                    }
                }
            }
        }
      }
    }
    
    alert (dateOutput);
Run Code Online (Sandbox Code Playgroud)


And*_* D. 6

var d1=new Date(2011,0,1); // jan,1 2011
var d2=new Date(); // now

var diff=d2-d1,sign=diff<0?-1:1,milliseconds,seconds,minutes,hours,days;
diff/=sign; // or diff=Math.abs(diff);
diff=(diff-(milliseconds=diff%1000))/1000;
diff=(diff-(seconds=diff%60))/60;
diff=(diff-(minutes=diff%60))/60;
days=(diff-(hours=diff%24))/24;

console.info(sign===1?"Elapsed: ":"Remains: ",
             days+" days, ",
             hours+" hours, ",
             minutes+" minutes, ",
             seconds+" seconds, ",
             milliseconds+" milliseconds.");
Run Code Online (Sandbox Code Playgroud)


小智 6

我认为这应该可以做到。

let today = new Date();
let form_date=new Date('2019-10-23')
let difference=form_date>today ? form_date-today : today-form_date
let diff_days=Math.floor(difference/(1000*3600*24))
Run Code Online (Sandbox Code Playgroud)


小智 6

基于 javascript 运行时原型实现,您可以使用简单的算术来减去日期,如下所示

\n
var sep = new Date(2020, 07, 31, 23, 59, 59);\nvar today = new Date();\nvar diffD = Math.floor((sep - today) / (1000 * 60 * 60 * 24));\nconsole.log('Day Diff: '+diffD);\n
Run Code Online (Sandbox Code Playgroud)\n

差异以毫秒形式返回答案,然后您必须通过除法将其转换:

\n
    \n
  • 乘 1000 转换为秒
  • \n
  • 按 1000\xc3\x9760 转换为分钟
  • \n
  • 按 1000\xc3\x9760\xc3\x9760 转换为小时
  • \n
  • 按 1000\xc3\x9760\xc3\x9760\xc3\x9724 转换为日
  • \n
\n


小智 5

function DateDiff(b, e)
{
    let
        endYear = e.getFullYear(),
        endMonth = e.getMonth(),
        years = endYear - b.getFullYear(),
        months = endMonth - b.getMonth(),
        days = e.getDate() - b.getDate();
    if (months < 0)
    {
        years--;
        months += 12;
    }
    if (days < 0)
    {
        months--;
        days += new Date(endYear, endMonth, 0).getDate();
    }
    return [years, months, days];
}

[years, months, days] = DateDiff(
    new Date("October 21, 1980"),
    new Date("July 11, 2017")); // 36 8 20
Run Code Online (Sandbox Code Playgroud)


小智 5

此代码将返回两个日期之间的天数差异:

const previous_date = new Date("2019-12-23");
const current_date = new Date();

const current_year = current_date.getFullYear();
const previous_date_year = 
previous_date.getFullYear();

const difference_in_years = current_year - 
previous_date_year;

let months = current_date.getMonth();
months = months + 1; // for making the indexing 
// of months from 1

for(let i = 0; i < difference_in_years; i++){
months = months + 12;
}

let days = current_date.getDate();

days = days + (months * 30.417);

console.log(`The days between ${current_date} and 
${previous_date} are : ${days} (approximately)`);
Run Code Online (Sandbox Code Playgroud)