我现在一直在使用moment.js,这使得日期操作变得容易很多但是我有一个特定的案例失败了,我看不出原因。
在计算今天(2013年10月31日)和2014年2月1日之间的差异时,虽然两个日期之间有3个完整的月份和1天,但差异时间差异为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);
控制台记录以下内容:
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()中的一个错误吗?我的其他测试用例中的每一个都成功通过。
答案 0 :(得分:41)
我认为这与The Fine Manual中描述的'特殊处理'有关:
经过优化,确保两个月的日期相同 总是一个整数。
1月15日至2月15日应该是1个月。
2月28日至3月28日应该是1个月。
2011年2月28日至2012年2月28日应该正好是1年。
Moment.js在处理31 Jan
和31 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
值是正确的,只是第二个例子将结果变成'日历月'差异。
(至于四舍五入,也在同一页上记录)
答案 1 :(得分: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;
这对我来说很有意义,因为当时正在做一些与diff有关的奇怪的事情我只是决定清楚我的结果是什么。
答案 2 :(得分:1)
简单易用的解决方案,如果您使用力矩库,则两个月之间的值存在正确的差异
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);