Javascript Moment.js月差

Javascript Moment.js月差,javascript,momentjs,Javascript,Momentjs,我已经使用了moment.js一段时间了,它让日期操作变得容易多了,但我有一个具体的例子失败了,我不明白为什么 当计算今天(2013年10月31日)和2014年2月1日之间的差异时,差异月份返回为2,尽管两个日期之间有3个完整的月份和一天 10月31日至1月31日期间的差异罚款:3个月零天 var mStartDate = moment([ periodStartDate.getFullYear(), periodStartDate.getMonth(), periodStartDate.get

我已经使用了moment.js一段时间了,它让日期操作变得容易多了,但我有一个具体的例子失败了,我不明白为什么

当计算今天(2013年10月31日)和2014年2月1日之间的差异时,差异月份返回为2,尽管两个日期之间有3个完整的月份和一天

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);
控制台记录以下内容:

periodStartDate: Thu Oct 31 2013 11:13:51 GMT+0000 (GMT)
someDate: Sat Feb 01 2014 11:13:51 GMT+0000 (GMT)
monthsDiff: 2
如果我将true作为布尔值传递给not-to-round,则月差为

monthsDiff: 2.983050847457627 

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

我认为这与“特殊处理”有关,如中所述:

它经过优化,以确保相同日期的两个月 总是分开一个整数

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

2月28日到3月28日正好是1个月

2011年2月28日至2012年2月28日应该正好是一年

Moment.js在处理
1月31日
10月31日
(同日)时应用此特殊处理:

因此
2.98
值是正确的,只是第二个示例将结果转换为“日历月”差


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

我走了另一条路,试图得到两个月之间的差值

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

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

var monthDifference = endMonths - startMonths;

这对我来说是有意义的,因为moment对diff做了一些奇怪的事情,所以我决定弄清楚我的结果是什么。

如果使用moment库,两个月之间的值差是正确的,简单易行的解决方案

  const monthDifference =  moment(new Date(endDate)).diff(new Date(startDate), 'months', true);
如果要在endDate中添加天数

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

我在2.2.1版上遇到过这种情况——我也能看到它在2.4.0版上发生。但与30/01相比,该值上升(计算31/01的差值时),然后又下降,这难道不奇怪吗?我希望是2.967,然后是3,然后是3.02之类的。如果两个日期之间有3个完整的月,那么当我加上一天时,怎么会少呢?在这一切之后,我做的另一件事是以“X月Y日”的方式显示差异。所以如果有2个月,那就需要我到31/12,然后有32天到达2月1日@Khain,因为天数值是相同的,它将值钳制为整数(这是“特殊处理”)。对于其他日期,它不会钳制并使用精确的(浮点)值。@robertklep您是指时刻([2013,10,31])。差异?可能是打字错误?你的意思是创建一个代表10月31日的实例?这应该是
时刻([2013,9,31])
(因为月份是0索引的,所以0是一月,1是二月,等等)。从最近的时刻库中,只需返回d.month()+d.year()*12为什么将年份乘以12?如果没有这一点,这不会达到同样的结果吗?我做了12次,因为如果我们的开始时间是2017年4月,结束时间是2018年1月,如果你只花几个月的时间,那么这一年会给你2021-2019=4,我正在寻找9。
 const monthDifference = moment(new Date(endDate.add(1, 'days'))).diff(new Date(startDate), 'months', true);