Подтвердить что ты не робот

Разница месяцев 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()? Каждый из моих других тестовых случаев проходит успешно.

4b9b3361

Ответ 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, я просто решил дать понять, каким будет мой результат.