From: Iskren Chernev Date: Sun, 10 Aug 2014 06:47:37 +0000 (-0700) Subject: Fix moment diff across dst in weird cases X-Git-Tag: 2.8.3~11^2~1 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=3669799c5fd3d5a4d8618eb668fd9abc26cef290;p=thirdparty%2Fmoment.git Fix moment diff across dst in weird cases moment diff across dst was sometimes failing because of a floating point rounding. Just make sure to first do additions/subtractions and then division. --- diff --git a/moment.js b/moment.js index 2941b9170..d49dee606 100644 --- a/moment.js +++ b/moment.js @@ -2154,7 +2154,7 @@ diff : function (input, units, asFloat) { var that = makeAs(input, this), zoneDiff = (this.zone() - that.zone()) * 6e4, - diff, output; + diff, output, daysAdjust; units = normalizeUnits(units); @@ -2165,11 +2165,12 @@ output = ((this.year() - that.year()) * 12) + (this.month() - that.month()); // adjust by taking difference in days, average number of days // and dst in the given months. - output += ((this - moment(this).startOf('month')) - - (that - moment(that).startOf('month'))) / diff; + daysAdjust = (this - moment(this).startOf('month')) - + (that - moment(that).startOf('month')); // same as above but with zones, to negate all dst - output -= ((this.zone() - moment(this).startOf('month').zone()) - - (that.zone() - moment(that).startOf('month').zone())) * 6e4 / diff; + daysAdjust -= ((this.zone() - moment(this).startOf('month').zone()) - + (that.zone() - moment(that).startOf('month').zone())) * 6e4; + output += daysAdjust / diff; if (units === 'year') { output = output / 12; } diff --git a/test/moment/diff.js b/test/moment/diff.js index 17a089a8f..0e3de1ee7 100644 --- a/test/moment/diff.js +++ b/test/moment/diff.js @@ -226,7 +226,21 @@ exports.diff = { test.done(); }, - 'year diffs' : function (test) { + "exact month diffs" : function (test) { + // generate all pairs of months and compute month diff, with fixed day + // of month = 15. + + var m1, m2; + for (m1 = 0; m1 < 12; ++m1) { + for (m2 = m1; m2 < 12; ++m2) { + test.equal(moment([2013, m2, 15]).diff(moment([2013, m1, 15]), 'months', true), m2 - m1, + "month diff from 2013-" + m1 + "-15 to 2013-" + m2 + "-15"); + } + } + test.done(); + }, + + "year diffs" : function (test) { test.expect(10); // due to floating point math errors, these tests just need to be accurate within 0.00000001