days = this._days,
months = this._months,
data = this._data,
- seconds, minutes, hours, years;
+ seconds, minutes, hours, years = 0;
// The following code bubbles up values, see the tests for
// examples of what that means.
data.hours = hours % 24;
days += absRound(hours / 24);
- data.days = days % 30;
+ // Accurately convert days to years, assume start from year 0.
+ years = absRound(days * 400 / 146097);
+ days -= years * 365 + absRound(years / 4) -
+ absRound(years / 100) + absRound(years / 400);
+
+ // 30 days to a month
+ // TODO (iskren): Use anchor date (like 1st Jan) to compute this.
months += absRound(days / 30);
- data.months = months % 12;
+ days %= 30;
+
+ // 12 months -> 1 year
+ years += absRound(months / 12);
+ months %= 12;
- years = absRound(months / 12);
+ data.days = days;
+ data.months = months;
data.years = years;
},
},
"instatiation from serialized C# TimeSpan maxValue" : function (test) {
- test.expect(6);
- test.equal(moment.duration("10675199.02:48:05.4775807").years(), 29653, "29653 years");
- test.equal(moment.duration("10675199.02:48:05.4775807").days(), 29, "29 day");
- test.equal(moment.duration("10675199.02:48:05.4775807").hours(), 2, "2 hours");
- test.equal(moment.duration("10675199.02:48:05.4775807").minutes(), 48, "48 minutes");
- test.equal(moment.duration("10675199.02:48:05.4775807").seconds(), 5, "5 seconds");
- test.equal(moment.duration("10675199.02:48:05.4775807").milliseconds(), 477, "477 milliseconds");
+ var d = moment.duration("10675199.02:48:05.4775807");
+
+ test.equal(d.years(), 29227, "29227 years");
+ test.equal(d.months(), 8, "8 months");
+ test.equal(d.days(), 17, "17 day"); // this should be 13
+
+ test.equal(d.hours(), 2, "2 hours");
+ test.equal(d.minutes(), 48, "48 minutes");
+ test.equal(d.seconds(), 5, "5 seconds");
+ test.equal(d.milliseconds(), 477, "477 milliseconds");
test.done();
},
"instatiation from serialized C# TimeSpan minValue" : function (test) {
- test.expect(6);
- test.equal(moment.duration("-10675199.02:48:05.4775808").years(), -29653, "29653 years");
- test.equal(moment.duration("-10675199.02:48:05.4775808").days(), -29, "29 day");
- test.equal(moment.duration("-10675199.02:48:05.4775808").hours(), -2, "2 hours");
- test.equal(moment.duration("-10675199.02:48:05.4775808").minutes(), -48, "48 minutes");
- test.equal(moment.duration("-10675199.02:48:05.4775808").seconds(), -5, "5 seconds");
- test.equal(moment.duration("-10675199.02:48:05.4775808").milliseconds(), -477, "477 milliseconds");
+ var d = moment.duration("-10675199.02:48:05.4775808");
+
+ test.equal(d.years(), -29227, "29653 years");
+ test.equal(d.months(), -8, "8 day");
+ test.equal(d.days(), -17, "17 day"); // this should be 13
+
+ test.equal(d.hours(), -2, "2 hours");
+ test.equal(d.minutes(), -48, "48 minutes");
+ test.equal(d.seconds(), -5, "5 seconds");
+ test.equal(d.milliseconds(), -477, "477 milliseconds");
test.done();
},