]> git.ipfire.org Git - thirdparty/moment.git/commitdiff
Fix #4145: floating-point errors in ISO duration format
authorAsh Searle <ash@hexmen.com>
Tue, 29 Aug 2017 18:54:07 +0000 (19:54 +0100)
committerAsh Searle <ash@hexmen.com>
Tue, 29 Aug 2017 18:54:07 +0000 (19:54 +0100)
src/lib/duration/iso-string.js
src/test/moment/duration.js

index 7bb022813d5ea21b2b713bfc8393c0b7621a6f27..ff783e0be765f64499e4a475632a7d04d7e44af4 100644 (file)
@@ -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
index f5b1a2789de87df261ced493629429f104f53dbd..88747b1065f65303e7ada7c967b5fee067a68a53 100644 (file)
@@ -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) {