【问题标题】:javascript: Calculate difference between two datesjavascript:计算两个日期之间的差异
【发布时间】:2013-02-01 20:58:53
【问题描述】:

我想找出两个日期之间的差异。为此,我确实从另一个 Date 对象中减去了一个 Date 对象。我的代码如下:

var d1 = new Date(); //"now"
var d2 = new Date(2012,3,17); // before one year
document.write("</br>Currrent date : "+d1);
document.write("</br>Other Date : "+d2);
document.write("</br>Difference : "+new Date(Math.abs(d1-d2)));

但结果并不如我所料:

当前日期:2013 年 2 月 17 日星期日 02:58:16 GMT-0500 (EST)
其他日期:2012 年 1 月 21 日星期六 00:00:00 GMT-0500 (EST)
差异:1971 年 1 月 28 日星期四 21:58:16 GMT-0500 (EST)

我想计算它们之间的(1 年)差异。

谢谢

【问题讨论】:

  • 你的计算结果必须是什么?天?秒?年?
  • 我想计算自该日期以来的天数、月数和年数...
  • 那么事情就变得棘手了 :) 所以你想要“2 年 5 个月 23 天后……”之类的东西?
  • 是的,我想做一些类似的事情。
  • 不要重新发明轮子,使用库,例如momentjs.com/docs/#/displaying/difference.

标签: javascript


【解决方案1】:

所以从根本上说,最大的精确日期单位是 week,它占 7 * 86400 秒。月份和年份没有精确定义。因此,假设您想说“1 个月前”,如果这两个日期是例如5.1.20135.2.20135.2.20135.3.2013。并说“1个月零1天前”,如果你有例如5.1.20136.2.2013,那么你将不得不使用这样的计算:

// dateFrom and dateTo have to be "Date" instances, and to has to be later/bigger than from.
function dateDiff(dateFrom, dateTo) {
  var from = {
    d: dateFrom.getDate(),
    m: dateFrom.getMonth() + 1,
    y: dateFrom.getFullYear()
  };

  var to = {
    d: dateTo.getDate(),
    m: dateTo.getMonth() + 1,
    y: dateTo.getFullYear()
  };

  var daysFebruary = to.y % 4 != 0 || (to.y % 100 == 0 && to.y % 400 != 0)? 28 : 29;
  var daysInMonths = [0, 31, daysFebruary, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];

  if (to.d < from.d) {
    to.d   += daysInMonths[parseInt(to.m)];
    from.m += 1;
  }
  if (to.m < from.m) {
    to.m   += 12;
    from.y += 1;
  }

  return {
    days:   to.d - from.d,
    months: to.m - from.m,
    years:  to.y - from.y
  };
}
// Difference from 1 June 2016 to now
console.log(dateDiff(new Date(2016,5,1), new Date()));

正如我所说,它变得棘手;)

【讨论】:

  • @Exception,有什么更简单的选择?考虑到闰年和每月的可变天数,看起来尽可能小。
  • @SimpleAsCouldBe 看看我的回答
【解决方案2】:

如果您需要相当准确,我建议您使用天数作为单位。年份的天数是可变的,月份也是如此,因此说“1 个月”或“1 年”可能意味着不同的天数。

var d1 = new Date(); //"now"
var d2 = new Date(2012,3,17); // before one year
var msPerDay = 1000*60*60*24;
document.write( ((d1 - d2) / msPerDay).toFixed(0) + " days ago");

【讨论】:

    【解决方案3】:

    您在寻找this 吗?

     Math.ceil((new Date(2012, 11, 23) - new Date(2012, 11, 21)) / 86400000) + 1
    

    【讨论】:

    • 日期对象的差异是以毫秒为单位的差异。除数 86400000 假定每年固定的天数,我认为这并不完全正确。
    • @SimpleAsCouldBe 86400000 毫秒相当于一天。所以逻辑是正确的
    • 有道理。所以这将计算天数。 OP 不清楚,但他正在寻找“2 年 7 个月 22 天”。这就是使问题具有挑战性的原因。
    【解决方案4】:

    你在找这个吗?

    Math.ceil((新日期(2012, 11, 23) - 新日期(2012, 11, 21)) / 864000) + 1

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-08-23
      • 1970-01-01
      • 1970-01-01
      • 2021-11-25
      • 2011-08-01
      相关资源
      最近更新 更多