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';
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;
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) {
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) {
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');
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) {
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) {