import absFloor from '../utils/abs-floor';
|
var abs = Math.abs;
|
|
function sign(x) {
|
return ((x > 0) - (x < 0)) || +x;
|
}
|
|
export function toISOString() {
|
// for ISO strings we do not use the normal bubbling rules:
|
// * milliseconds bubble up until they become hours
|
// * days do not bubble at all
|
// * months bubble up until they become years
|
// This is because there is no context-free conversion between hours and days
|
// (think of clock changes)
|
// and also not between days and months (28-31 days per month)
|
if (!this.isValid()) {
|
return this.localeData().invalidDate();
|
}
|
|
var seconds = abs(this._milliseconds) / 1000;
|
var days = abs(this._days);
|
var months = abs(this._months);
|
var minutes, hours, years;
|
|
// 3600 seconds -> 60 minutes -> 1 hour
|
minutes = absFloor(seconds / 60);
|
hours = absFloor(minutes / 60);
|
seconds %= 60;
|
minutes %= 60;
|
|
// 12 months -> 1 year
|
years = absFloor(months / 12);
|
months %= 12;
|
|
|
// inspired by https://github.com/dordille/moment-isoduration/blob/master/moment.isoduration.js
|
var Y = years;
|
var M = months;
|
var D = days;
|
var h = hours;
|
var m = minutes;
|
var s = seconds ? seconds.toFixed(3).replace(/\.?0+$/, '') : '';
|
var total = this.asSeconds();
|
|
if (!total) {
|
// this is the same as C#'s (Noda) and python (isodate)...
|
// but not other JS (goog.date)
|
return 'P0D';
|
}
|
|
var totalSign = total < 0 ? '-' : '';
|
var ymSign = sign(this._months) !== sign(total) ? '-' : '';
|
var daysSign = sign(this._days) !== sign(total) ? '-' : '';
|
var hmsSign = sign(this._milliseconds) !== sign(total) ? '-' : '';
|
|
return totalSign + 'P' +
|
(Y ? ymSign + Y + 'Y' : '') +
|
(M ? ymSign + M + 'M' : '') +
|
(D ? daysSign + D + 'D' : '') +
|
((h || m || s) ? 'T' : '') +
|
(h ? hmsSign + h + 'H' : '') +
|
(m ? hmsSign + m + 'M' : '') +
|
(s ? hmsSign + s + 'S' : '');
|
}
|