Moment.js months difference
Solution 1:
I think this has to do with the 'special handling' as described in The Fine Manual:
It is optimized to ensure that two months with the same date are always a whole number apart.
So Jan 15 to Feb 15 should be exactly 1 month.
Feb 28 to Mar 28 should be exactly 1 month.
Feb 28 2011 to Feb 28 2012 should be exactly 1 year.
Moment.js applies this special handling when dealing with 31 Jan
and 31 Oct
(having the same day):
// 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
So the 2.98
value is correct, it's just that the second example turns the result into a 'calender months' difference.
(as for rounding down to 2, that's also documented on the same page)
Solution 2:
I went a different route trying to get the difference between two months
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;
This made sense to me and since moment is doing some strange things with diff I just decided to make it clear what my result will be.
Solution 3:
Simple And Easy Solution with correct value difference between two months if you are using moment Library
const monthDifference = moment(new Date(endDate)).diff(new Date(startDate), 'months', true);
If you want to add the number of days in endDate
const monthDifference = moment(new Date(endDate.add(1, 'days'))).diff(new Date(startDate), 'months', true);