提问者:小点点

moment.js月差


我使用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作为不舍入的布尔值传递,则月差为

monthsDiff: 2.983050847457627 

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


共1个答案

匿名用户

我认为这与本手册中所述的“特殊处理”有关:

对其进行了优化,以确保日期相同的两个月总是相隔一个整数。

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

2月28日到3月28日应该正好是1个月。

2011年2月28日至2012年2月28日正好是1年。

Moment.js在处理31 Jan31 Oct(具有同一天)时应用此特殊处理:

// 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

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

(至于向下舍入为2,这也在同一页上记录了)