From a63b46a84e559be632348f284ef8b83f70593e73 Mon Sep 17 00:00:00 2001 From: Iskren Chernev Date: Wed, 29 Apr 2020 18:56:37 +0300 Subject: [PATCH] Use month with bigger date first when computing month diffs --- src/lib/moment/diff.js | 5 +++++ src/test/moment/diff.js | 31 +++++++++++++++++++++++++++---- 2 files changed, 32 insertions(+), 4 deletions(-) diff --git a/src/lib/moment/diff.js b/src/lib/moment/diff.js index baa3f7184..5157318c4 100644 --- a/src/lib/moment/diff.js +++ b/src/lib/moment/diff.js @@ -52,6 +52,11 @@ export function diff(input, units, asFloat) { } function monthDiff(a, b) { + if (a.date() < b.date()) { + // end-of-month calculations work correct when the start month has more + // days than the end month. + return -monthDiff(b, a); + } // difference in months var wholeMonthDiff = (b.year() - a.year()) * 12 + (b.month() - a.month()), // b is in (anchor - 1 month, anchor + 1 month) diff --git a/src/test/moment/diff.js b/src/test/moment/diff.js index 47ad599d2..279b8a8f8 100644 --- a/src/test/moment/diff.js +++ b/src/test/moment/diff.js @@ -210,13 +210,36 @@ test('diff month', function (assert) { }); test('end of month diff', function (assert) { - assert.equal(moment([2016, 1, 29]).diff([2016, 0, 30], 'months'), 1, 'Feb 29 to Jan 30 should be 1 month'); - assert.equal(moment([2016, 1, 29]).diff([2016, 0, 31], 'months'), 1, 'Feb 30 to Jan 31 should be 1 month'); - assert.equal(moment([2016, 4, 31]).add(1,'month').diff(moment([2016, 4, 31]), 'month'), 1, '(May 31 plus 1 month) to May 31 should be 1 month diff'); + assert.equal( + moment('2016-02-29').diff('2016-01-30', 'months'), + 1, + 'Feb 29 to Jan 30 should be 1 month' + ); + assert.equal( + moment('2016-02-29').diff('2016-01-31', 'months'), + 1, + 'Feb 29 to Jan 31 should be 1 month' + ); + assert.equal( + moment('2016-05-31') + .add(1, 'month') + .diff(moment('2016-05-31'), 'month'), + 1, + '(May 31 plus 1 month) to May 31 should be 1 month diff' + ); }); test('end of month diff with time behind', function (assert) { - assert.equal(moment([2017, 2, 31, 1]).diff([2017, 1, 28, 2], 'months'), 1, 'Feb 28 to March 31 should be 1 month'); + assert.equal( + moment('2017-03-31').diff('2017-02-28', 'months'), + 1, + 'Feb 28 to March 31 should be 1 month' + ); + assert.equal( + moment('2017-02-28').diff('2017-03-31', 'months'), + -1, + 'Feb 28 to March 31 should be 1 month' + ); }); test('diff across DST', function (assert) { -- 2.47.2