Moment.js月差异

Kha*_*ain 42 javascript momentjs

我现在一直在使用moment.js,这使得日期操作变得容易多了但是我有一个特定的情况是失败的,我不明白为什么.

在计算今天(2013年10月31日)和2014年2月1日之间的差异时,虽然两个日期之间有3个完整的月份和一天,但是差异时间差异为2.

10月31日至1月31日之间的差异很好:3个月零天.

var mStartDate = moment([ periodStartDate.getFullYear(), periodStartDate.getMonth(), periodStartDate.getDate() ]);
var mTermDate = moment([ someDate.getFullYear(), someDate.getMonth(), someDate.getDate() ]);

console.log('periodStartDate: ' + periodStartDate);
console.log('someDate: ' + someDate);

// Years
var yearsDiff = mTermDate.diff(mStartDate, 'years');

// Months
var monthsDiff = mTermDate.diff(mStartDate, 'months', true);
Run Code Online (Sandbox Code Playgroud)

控制台记录以下内容:

periodStartDate: Thu Oct 31 2013 11:13:51 GMT+0000 (GMT)
someDate: Sat Feb 01 2014 11:13:51 GMT+0000 (GMT)
monthsDiff: 2
Run Code Online (Sandbox Code Playgroud)

如果我传递true作为布尔值而不是舍入,那么差异就是几个月

monthsDiff: 2.983050847457627 
Run Code Online (Sandbox Code Playgroud)

这只是Moment.js.diff()中的一个错误吗?我的其他测试用例中的每一个都成功通过.

rob*_*lep 47

我认为这与" 精细手册 "中描述的"特殊处理"有关:

它经过优化,可确保相同日期的两个月始终是一个整数.

所以1月15日到2月15日应该是1个月.

2月28日至3月28日应该正好是1个月.

2011年2月28日至2012年2月28日应该是1年.

在处理31 Jan31 Oct(当天)时,Moment.js应用此特殊处理:

// 31 Oct 2013 - 1 Feb 2014
> moment([2014, 1, 1]).diff(moment([2013, 9, 31]), 'months', true)
2.983050847457627

// 31 Oct 2013 - 31 Jan 2014
> moment([2014, 0, 31]).diff(moment([2013, 9, 31]), 'months', true)
3

// 31 Oct 2013 - 30 Jan 2014
> moment([2014, 0, 30]).diff(moment([2013, 9, 31]), 'months', true)
2.967741935483871
Run Code Online (Sandbox Code Playgroud)

所以2.98价值是正确的,只是第二个例子将结果变成'日历月'差异.

(至于四舍五入,也记录在同一页面上)


MrB*_*MrB 10

我试着在两个月之间找到差异

function getAbsoulteMonths(momentDate) {
  var months = Number(momentDate.format("MM"));
  var years = Number(momentDate.format("YYYY"));
  return months + (years * 12);
}

var startMonths = getAbsoulteMonths(start);
var endMonths = getAbsoulteMonths(end);

var monthDifference = endMonths - startMonths;
Run Code Online (Sandbox Code Playgroud)

这对我来说很有意义,因为当时我正在做一些与diff有关的奇怪事情,我决定明确我的结果是什么.

  • 从最新的时刻库,只需返回 d.month() + d.year()*12 (2认同)
  • 我做了 12 次,因为如果我们的开始时间是 04-2017 年,结束时间是 01-2018 年,如果你只用了几个月 + 年,你就会得到 2021 - 2019 = 4,我正在寻找 9。 (2认同)

小智 7

如果您使用的是 moment 库,则具有两个月之间正确值差异的简单而简单的解决方案

  const monthDifference =  moment(new Date(endDate)).diff(new Date(startDate), 'months', true);
Run Code Online (Sandbox Code Playgroud)

如果要在 endDate 中添加天数

 const monthDifference = moment(new Date(endDate.add(1, 'days'))).diff(new Date(startDate), 'months', true);
Run Code Online (Sandbox Code Playgroud)