Разница месяцев Moment.js
Я использовал moment.js в течение короткого времени, и это упростило обработку дат, но у меня есть конкретный случай, который терпит неудачу, и я не понимаю, почему.
При расчете разницы между сегодняшним днем (31 октября 2013 года) и 1 февраля 2014 года разница в месяцах возвращается как 2, хотя между двумя датами есть 3 полных месяца и один день.
Разница между 31 октября и 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()? Каждый из моих других тестовых случаев проходит успешно.
Ответы
Ответ 1
Я думаю, что это связано с "специальной обработкой", как описано в The Fine Manual:
Он оптимизирован для обеспечения того, чтобы два месяца с той же датой были всегда целое число.
Итак, с 15 января по 15 февраля должно быть ровно 1 месяц.
С 28 по 28 марта должно быть ровно 1 месяц.
28 февраля 2011 года по 28 февраля 2012 года должно быть ровно 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
верное, просто потому, что второй пример превращает результат в разницу "календарных месяцев".
(как для округления до 2, что также описано на той же странице)
Ответ 2
Я пошел другим путем, пытаясь получить разницу между двумя месяцами
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, я просто решил дать понять, каким будет мой результат.