From: Ash Searle Date: Tue, 29 Aug 2017 18:54:07 +0000 (+0100) Subject: Fix #4145: floating-point errors in ISO duration format X-Git-Tag: 2.19.0~10^2~2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=d031c5de00d83bd4c04451e1f4ecbd593be00f65;p=thirdparty%2Fmoment.git Fix #4145: floating-point errors in ISO duration format --- diff --git a/src/lib/duration/iso-string.js b/src/lib/duration/iso-string.js index 7bb022813..ff783e0be 100644 --- a/src/lib/duration/iso-string.js +++ b/src/lib/duration/iso-string.js @@ -13,7 +13,8 @@ export function toISOString() { return this.localeData().invalidDate(); } - var seconds = abs(this._milliseconds) / 1000; + var milliseconds = abs(this._milliseconds); + var seconds = absFloor(milliseconds / 1000); var days = abs(this._days); var months = abs(this._months); var minutes, hours, years; @@ -22,6 +23,7 @@ export function toISOString() { minutes = absFloor(seconds / 60); hours = absFloor(minutes / 60); seconds %= 60; + seconds += (milliseconds % 1000) / 1000; minutes %= 60; // 12 months -> 1 year diff --git a/src/test/moment/duration.js b/src/test/moment/duration.js index f5b1a2789..88747b106 100644 --- a/src/test/moment/duration.js +++ b/src/test/moment/duration.js @@ -336,6 +336,7 @@ test('serialization to ISO 8601 duration strings', function (assert) { assert.equal(moment.duration({y: +1, M: 1}).toISOString(), 'P1Y1M', 'a month after a year in future'); assert.equal(moment.duration({}).toISOString(), 'P0D', 'zero duration'); assert.equal(moment.duration({M: 16, d:40, s: 86465}).toISOString(), 'P1Y4M40DT24H1M5S', 'all fields'); + assert.equal(moment.duration({ms: 123456789}).toISOString(), 'PT34H17M36.789S', 'check floating-point errors'); }); test('toString acts as toISOString', function (assert) {