如何计算 JavaScript 中的日期差异?

IT技术 javascript datetime
2021-01-26 15:54:26

我想计算以天、小时、分钟、秒、毫秒、纳秒为单位的日期差异。我该怎么做?

6个回答

假设您有两个Dateobject,您可以将它们相减以获得以毫秒为单位的差异:

var difference = date2 - date1;

从那里,您可以使用简单的算术来推导出其他值。

@RobG 相对主义者甚至可能认为大于 1 或小于 0。这完全取决于观察者。
2021-03-13 15:54:26
@trisweb——即使是像获得天数差异这样简单的事情也比您的评论更复杂。从星期二晚上 10 点到星期三早上 9 点之间有多少天?你的算法说是 0。其他人可能会认为是 1。
2021-03-15 15:54:26
没有将毫秒转换为年的“简单”算法。您必须了解 bissextile 年份、时区,有些日子有 23 或 25 小时。有些年份有 365,25 天,所以这里没有简单的算术(仍在寻找准确的解决方案)。
2021-03-20 15:54:26
这就是正确的答案。例如:要获得天数差异Math.floor((date2 - date1) / (1000*60*60*24))- 对于任何其他单位的差异,请调整分母(基值以毫秒为单位)。
2021-03-27 15:54:26
@Alexandre:这个问题多年来从未问过。事实上,计算年份差异并非易事。但是,对于几天,假设日期在同一时区中是正确的(并非不合理的假设)。据我所知,一天被定义为 24 小时,并且由于夏令时而导致的任何“变化”实际上是时区的切换。如果您还没有区分时区,那么试图找出时差会让您陷入困境,尤其是因为 DST 切换“重复”了时间。但是,请保持在一个时区,并且一切正常。
2021-04-08 15:54:26
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));

代码示例取自此处

好又简单
2021-03-25 15:54:26
如果用作单个计数器,这仅返回给定格式的日期差异。例如,如果您想要 3 个月零 4 天零 5 小时,则不会产生这些结果。更多在 3 个月 96 天和很多小时。
2021-03-29 15:54:26
这不考虑夏令时。
2021-04-07 15:54:26

另一种解决方案是将差异转换为新的 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

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

不是这个意思!我们想要完全不同!在这个例子中,天数的差异是 1281,而不是 4!
2021-03-17 15:54:26
@chaim.dev “如果你想在人类可读的风格上有所不同,那可以帮助你。”
2021-03-23 15:54:26
此解决方案仅适用于一年的游戏中时光倒流,它失败的时间不止于此,因为它永远不会返回超过 12 个月。
2021-03-25 15:54:26
这是不可靠的。它没有考虑到不同的月份长度、闰年和其他异常情况。
2021-03-26 15:54:26
谢谢 Murat,这个解决方案解决了我的问题。我真正想要的是它必须以与 php 相同的方式工作。
2021-03-29 15:54:26

诸如“天差之别”之类的表达从来没有看起来那么简单。如果您有以下日期:

d1: 2011-10-15 23:59:00
d1: 2011-10-16 00:01:00

时间差是 2 分钟,“天差”应该是 1 还是 0?由于年、月和日的长度和时间不同(例如,夏令时开始的那一天比平常短 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 );
}

这可以更简洁:

/*  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>');
});

@RobG 请在更简洁的解决方案的评论中编辑示例。月份应该是“12”而不是“22”
2021-03-10 15:54:26
@RafiB。—我不知道你认为一个比另一个更准确,它们基本上做相同的事情,即使用 UTC 时间值计算整天的差异。问题中的歧义没有得到澄清。如果是,它可能会导致不同的解决方案。
2021-03-14 15:54:26
@rudeovskiz​​ebear—在 IE、Firefox 和 Safari 中测试,工作正常。它使用基本的 ECMAScript,我希望可以在任何浏览器中使用,什么对您不起作用?
2021-03-20 15:54:26
@IgorKudryashov——抱歉,我只是没听懂。2000年是闰年,所以2000年2月28日到2001年2月28日是366天。在非闰年中,它是 365 天。我添加了更多示例。
2021-03-26 15:54:26
我把它放在一个测试页面上,它在 chrome 中运行良好,但我在 IE9 和最新的 FF 中一直返回 null
2021-03-31 15:54:26
<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>
对我没有帮助。不能以相同的方法将其扩展到数月或数年。
2021-03-15 15:54:26