From: not-an-aardvark Date: Mon, 4 Jul 2016 04:41:11 +0000 (-0400) Subject: Use extra duration precision for rounding X-Git-Tag: 2.15.0~26^2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=902b3db221b92909d2ab24d2edf7ef1bdab15911;p=thirdparty%2Fmoment.git Use extra duration precision for rounding --- diff --git a/src/lib/duration/create.js b/src/lib/duration/create.js index 1324d4518..354a5e0fa 100644 --- a/src/lib/duration/create.js +++ b/src/lib/duration/create.js @@ -1,5 +1,6 @@ import { Duration, isDuration } from './constructor'; import toInt from '../utils/to-int'; +import absRound from '../utils/abs-round'; import hasOwnProp from '../utils/has-own-prop'; import { DATE, HOUR, MINUTE, SECOND, MILLISECOND } from '../units/constants'; import { cloneWithOffset } from '../units/offset'; @@ -38,11 +39,11 @@ export function createDuration (input, key) { sign = (match[1] === '-') ? -1 : 1; duration = { y : 0, - d : toInt(match[DATE]) * sign, - h : toInt(match[HOUR]) * sign, - m : toInt(match[MINUTE]) * sign, - s : toInt(match[SECOND]) * sign, - ms : toInt(match[MILLISECOND] * 1000) * sign // the millisecond decimal point is included in the match + d : toInt(match[DATE]) * sign, + h : toInt(match[HOUR]) * sign, + m : toInt(match[MINUTE]) * sign, + s : toInt(match[SECOND]) * sign, + ms : toInt(absRound(match[MILLISECOND] * 1000)) * sign // the millisecond decimal point is included in the match }; } else if (!!(match = isoRegex.exec(input))) { sign = (match[1] === '-') ? -1 : 1; diff --git a/src/test/moment/duration.js b/src/test/moment/duration.js index f1434a3ee..c766961ba 100644 --- a/src/test/moment/duration.js +++ b/src/test/moment/duration.js @@ -178,15 +178,15 @@ test('instatiation from serialized C# TimeSpan with days', function (assert) { assert.equal(moment.duration('1.02:03:04.9999999').days(), 1, '1 day'); assert.equal(moment.duration('1.02:03:04.9999999').hours(), 2, '2 hours'); assert.equal(moment.duration('1.02:03:04.9999999').minutes(), 3, '3 minutes'); - assert.equal(moment.duration('1.02:03:04.9999999').seconds(), 4, '4 seconds'); - assert.equal(moment.duration('1.02:03:04.9999999').milliseconds(), 999, '999 milliseconds'); + assert.equal(moment.duration('1.02:03:04.9999999').seconds(), 5, '5 seconds'); + assert.equal(moment.duration('1.02:03:04.9999999').milliseconds(), 0, '0 milliseconds'); assert.equal(moment.duration('1 02:03:04.9999999').years(), 0, '0 years'); assert.equal(moment.duration('1 02:03:04.9999999').days(), 1, '1 day'); assert.equal(moment.duration('1 02:03:04.9999999').hours(), 2, '2 hours'); assert.equal(moment.duration('1 02:03:04.9999999').minutes(), 3, '3 minutes'); - assert.equal(moment.duration('1 02:03:04.9999999').seconds(), 4, '4 seconds'); - assert.equal(moment.duration('1 02:03:04.9999999').milliseconds(), 999, '999 milliseconds'); + assert.equal(moment.duration('1 02:03:04.9999999').seconds(), 5, '5 seconds'); + assert.equal(moment.duration('1 02:03:04.9999999').milliseconds(), 0, '0 milliseconds'); }); test('instatiation from serialized C# TimeSpan without days', function (assert) { @@ -194,14 +194,17 @@ test('instatiation from serialized C# TimeSpan without days', function (assert) assert.equal(moment.duration('01:02:03.9999999').days(), 0, '0 days'); assert.equal(moment.duration('01:02:03.9999999').hours(), 1, '1 hour'); assert.equal(moment.duration('01:02:03.9999999').minutes(), 2, '2 minutes'); - assert.equal(moment.duration('01:02:03.9999999').seconds(), 3, '3 seconds'); - assert.equal(moment.duration('01:02:03.9999999').milliseconds(), 999, '999 milliseconds'); + assert.equal(moment.duration('01:02:03.9999999').seconds(), 4, '4 seconds'); + assert.equal(moment.duration('01:02:03.9999999').milliseconds(), 0, '0 milliseconds'); - assert.equal(moment.duration('23:59:59.9999999').days(), 0, '0 days'); - assert.equal(moment.duration('23:59:59.9999999').hours(), 23, '23 hours'); + assert.equal(moment.duration('23:59:59.9999999').days(), 1, '1 days'); + assert.equal(moment.duration('23:59:59.9999999').hours(), 0, '0 hours'); + assert.equal(moment.duration('23:59:59.9999999').minutes(), 0, '0 minutes'); + assert.equal(moment.duration('23:59:59.9999999').seconds(), 0, '0 seconds'); + assert.equal(moment.duration('23:59:59.9999999').milliseconds(), 0, '0 milliseconds'); - assert.equal(moment.duration('500:59:59.9999999').days(), 20, '500 hours overflows to 20 days'); - assert.equal(moment.duration('500:59:59.9999999').hours(), 20, '500 hours overflows to 20 hours'); + assert.equal(moment.duration('500:59:59.8888888').days(), 20, '500 hours overflows to 20 days'); + assert.equal(moment.duration('500:59:59.8888888').hours(), 20, '500 hours overflows to 20 hours'); }); test('instatiation from serialized C# TimeSpan without days or milliseconds', function (assert) { @@ -235,6 +238,20 @@ test('instantiation from serialized C# TimeSpan with low millisecond precision', assert.equal(moment.duration('00:00:15.').milliseconds(), 0, '0 milliseconds'); }); +test('instantiation from serialized C# TimeSpan with high millisecond precision', function (assert) { + assert.equal(moment.duration('00:00:15.7200000').seconds(), 15, '15 seconds'); + assert.equal(moment.duration('00:00:15.7200000').milliseconds(), 720, '720 milliseconds'); + + assert.equal(moment.duration('00:00:15.7209999').seconds(), 15, '15 seconds'); + assert.equal(moment.duration('00:00:15.7209999').milliseconds(), 721, '721 milliseconds'); + + assert.equal(moment.duration('00:00:15.7205000').seconds(), 15, '15 seconds'); + assert.equal(moment.duration('00:00:15.7205000').milliseconds(), 721, '721 milliseconds'); + + assert.equal(moment.duration('-00:00:15.7205000').seconds(), -15, '15 seconds'); + assert.equal(moment.duration('-00:00:15.7205000').milliseconds(), -721, '721 milliseconds'); +}); + test('instatiation from serialized C# TimeSpan maxValue', function (assert) { var d = moment.duration('10675199.02:48:05.4775807'); @@ -245,7 +262,7 @@ test('instatiation from serialized C# TimeSpan maxValue', function (assert) { assert.equal(d.hours(), 2, '2 hours'); assert.equal(d.minutes(), 48, '48 minutes'); assert.equal(d.seconds(), 5, '5 seconds'); - assert.equal(d.milliseconds(), 477, '477 milliseconds'); + assert.equal(d.milliseconds(), 478, '478 milliseconds'); }); test('instatiation from serialized C# TimeSpan minValue', function (assert) { @@ -258,7 +275,7 @@ test('instatiation from serialized C# TimeSpan minValue', function (assert) { assert.equal(d.hours(), -2, '2 hours'); assert.equal(d.minutes(), -48, '48 minutes'); assert.equal(d.seconds(), -5, '5 seconds'); - assert.equal(d.milliseconds(), -477, '477 milliseconds'); + assert.equal(d.milliseconds(), -478, '478 milliseconds'); }); test('instantiation from ISO 8601 duration', function (assert) {