【问题标题】:How to subtract date/time in JavaScript? [duplicate]如何在 JavaScript 中减去日期/时间? [复制]
【发布时间】:2025-12-22 21:45:17
【问题描述】:

我在包含日期/时间的网格中有一个字段,我需要知道它与当前日期/时间之间的区别。最好的方法是什么?

日期存储为"2011-02-07 15:13:06"

【问题讨论】:

  • 日期/时间的格式是什么?
  • 它是这样存储的“2011-02-07 15:13:06”
  • 这不是重复的。它有一个不同的解决方案,并且解释得更好。它还具有更好的搜索排名。

标签: javascript date


【解决方案1】:

这将为您提供两个日期之间的差异,以毫秒为单位

var diff = Math.abs(date1 - date2);

在你的例子中,它会是

var diff = Math.abs(new Date() - compareDate);

您需要确保compareDate 是一个有效的Date 对象。

这样的东西可能对你有用

var diff = Math.abs(new Date() - new Date(dateStr.replace(/-/g,'/')));

即将"2011-02-07 15:13:06" 转换为new Date('2011/02/07 15:13:06'),这是Date 构造函数可以理解的格式。

【讨论】:

  • 这会忽略本地时区的 DTS 处理(适用于 UTC)
  • 在 TypeScript 中尝试执行此操作时出现 tslint 错误:var diff = Math.abs(new Date() - compareDate);
  • @Ethan:确实有效。时间应该被添加。 1980/1/1 和 1960/1/1 之间的差异是 epoch 和 1980 之间的十年,加上 1960 和 epoch 之间的 10 年。另一方面,1980/1/1 和 1975/1/1 之间的差异是 epoch 和 1980 之间的十年,减去 1975 和 epoch 之间的 5 年。两种情况都涵盖。
  • @DavidHedlund 是的,你完全正确。我的脑袋放屁;删除评论。
  • 如果你在夏令时,这会给出错误的结果
【解决方案2】:

如果您希望获得挂钟时间、本地时区和夏令时意识的差异。


Date.prototype.diffDays = function (date: Date): number {

    var utcThis = Date.UTC(this.getFullYear(), this.getMonth(), this.getDate(), this.getHours(), this.getMinutes(), this.getSeconds(), this.getMilliseconds());
    var utcOther = Date.UTC(date.getFullYear(), date.getMonth(), date.getDate(), date.getHours(), date.getMinutes(), date.getSeconds(), date.getMilliseconds());

    return (utcThis - utcOther) / 86400000;
};

测试


it('diffDays - Czech DST', function () {
    // expect this to parse as local time
    // with Czech calendar DST change happened 2012-03-25 02:00
    var pre = new Date('2012/03/24 03:04:05');
    var post = new Date('2012/03/27 03:04:05');

    // regardless DST, you still wish to see 3 days
    expect(pre.diffDays(post)).toEqual(-3);
});

区分分钟或秒的方式相同。

【讨论】:

  • 绝妙的答案,我在整个网络上搜索夏令时问题的解决方案,最后,你来了!
【解决方案3】:

你可以只减去两个日期对象。

var d1 = new Date(); //"now"
var d2 = new Date("2011/02/01");  // some date
var diff = Math.abs(d1-d2);  // difference in milliseconds

【讨论】:

  • 如果 d2 在 1970 之前,这将不起作用;在这种情况下,它的时间戳(以毫秒为单位)将为负数,并且 unix epoch 和 d2 之间的时间实际上会被添加到 d1。
  • @Ethan 是的,它会被添加,这就是重点。 3和-3的差是6,3 - (-3) == 3 + 3 == 6
  • (new Date("1970/01/02") - new Date("1969/12/29")) /1000/60/60/24 === 4
【解决方案4】:

除非您在同一浏览器客户端上减去日期并且不关心诸如夏令时更改之类的极端情况,否则您最好使用提供强大本地化 API 的moment.js。例如,这就是我在 utils.js 中的内容:

subtractDates: function(date1, date2) {
    return moment.subtract(date1, date2).milliseconds();
},
millisecondsSince: function(dateSince) {
    return moment().subtract(dateSince).milliseconds();
},

【讨论】:

【解决方案5】:

您可以使用getTime() 方法将Date 转换为自1970 年1 月1 日以来的毫秒数。然后您可以轻松地对日期进行任何算术运算。当然,您可以使用setTime() 将数字转换回Date。请参阅here 示例。

【讨论】: