262 lines
6.3 KiB
JavaScript
262 lines
6.3 KiB
JavaScript
import { MILLISECONDS_A_DAY, MILLISECONDS_A_HOUR, MILLISECONDS_A_MINUTE, MILLISECONDS_A_SECOND, MILLISECONDS_A_WEEK } from '../../constant';
|
|
var MILLISECONDS_A_YEAR = MILLISECONDS_A_DAY * 365;
|
|
var MILLISECONDS_A_MONTH = MILLISECONDS_A_DAY * 30;
|
|
var durationRegex = /^(-|\+)?P(?:([-+]?[0-9,.]*)Y)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)W)?(?:([-+]?[0-9,.]*)D)?(?:T(?:([-+]?[0-9,.]*)H)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)S)?)?$/;
|
|
var unitToMS = {
|
|
years: MILLISECONDS_A_YEAR,
|
|
months: MILLISECONDS_A_MONTH,
|
|
days: MILLISECONDS_A_DAY,
|
|
hours: MILLISECONDS_A_HOUR,
|
|
minutes: MILLISECONDS_A_MINUTE,
|
|
seconds: MILLISECONDS_A_SECOND,
|
|
milliseconds: 1,
|
|
weeks: MILLISECONDS_A_WEEK
|
|
};
|
|
|
|
var isDuration = function isDuration(d) {
|
|
return d instanceof Duration;
|
|
}; // eslint-disable-line no-use-before-define
|
|
|
|
|
|
var $d;
|
|
var $u;
|
|
|
|
var wrapper = function wrapper(input, instance, unit) {
|
|
return new Duration(input, unit, instance.$l);
|
|
}; // eslint-disable-line no-use-before-define
|
|
|
|
|
|
var prettyUnit = function prettyUnit(unit) {
|
|
return $u.p(unit) + "s";
|
|
};
|
|
|
|
var Duration = /*#__PURE__*/function () {
|
|
function Duration(input, unit, locale) {
|
|
var _this = this;
|
|
|
|
this.$d = {};
|
|
this.$l = locale;
|
|
|
|
if (unit) {
|
|
return wrapper(input * unitToMS[prettyUnit(unit)], this);
|
|
}
|
|
|
|
if (typeof input === 'number') {
|
|
this.$ms = input;
|
|
this.parseFromMilliseconds();
|
|
return this;
|
|
}
|
|
|
|
if (typeof input === 'object') {
|
|
Object.keys(input).forEach(function (k) {
|
|
_this.$d[prettyUnit(k)] = input[k];
|
|
});
|
|
this.calMilliseconds();
|
|
return this;
|
|
}
|
|
|
|
if (typeof input === 'string') {
|
|
var d = input.match(durationRegex);
|
|
|
|
if (d) {
|
|
this.$d.years = d[2];
|
|
this.$d.months = d[3];
|
|
this.$d.weeks = d[4];
|
|
this.$d.days = d[5];
|
|
this.$d.hours = d[6];
|
|
this.$d.minutes = d[7];
|
|
this.$d.seconds = d[8];
|
|
this.calMilliseconds();
|
|
return this;
|
|
}
|
|
}
|
|
|
|
return this;
|
|
}
|
|
|
|
var _proto = Duration.prototype;
|
|
|
|
_proto.calMilliseconds = function calMilliseconds() {
|
|
var _this2 = this;
|
|
|
|
this.$ms = Object.keys(this.$d).reduce(function (total, unit) {
|
|
return total + (_this2.$d[unit] || 0) * (unitToMS[unit] || 1);
|
|
}, 0);
|
|
};
|
|
|
|
_proto.parseFromMilliseconds = function parseFromMilliseconds() {
|
|
var $ms = this.$ms;
|
|
this.$d.years = Math.floor($ms / MILLISECONDS_A_YEAR);
|
|
$ms %= MILLISECONDS_A_YEAR;
|
|
this.$d.months = Math.floor($ms / MILLISECONDS_A_MONTH);
|
|
$ms %= MILLISECONDS_A_MONTH;
|
|
this.$d.days = Math.floor($ms / MILLISECONDS_A_DAY);
|
|
$ms %= MILLISECONDS_A_DAY;
|
|
this.$d.hours = Math.floor($ms / MILLISECONDS_A_HOUR);
|
|
$ms %= MILLISECONDS_A_HOUR;
|
|
this.$d.minutes = Math.floor($ms / MILLISECONDS_A_MINUTE);
|
|
$ms %= MILLISECONDS_A_MINUTE;
|
|
this.$d.seconds = Math.floor($ms / MILLISECONDS_A_SECOND);
|
|
$ms %= MILLISECONDS_A_SECOND;
|
|
this.$d.milliseconds = $ms;
|
|
};
|
|
|
|
_proto.toISOString = function toISOString() {
|
|
var Y = this.$d.years ? this.$d.years + "Y" : '';
|
|
var M = this.$d.months ? this.$d.months + "M" : '';
|
|
var days = +this.$d.days || 0;
|
|
|
|
if (this.$d.weeks) {
|
|
days += this.$d.weeks * 7;
|
|
}
|
|
|
|
var D = days ? days + "D" : '';
|
|
var H = this.$d.hours ? this.$d.hours + "H" : '';
|
|
var m = this.$d.minutes ? this.$d.minutes + "M" : '';
|
|
var seconds = this.$d.seconds || 0;
|
|
|
|
if (this.$d.milliseconds) {
|
|
seconds += this.$d.milliseconds / 1000;
|
|
}
|
|
|
|
var S = seconds ? seconds + "S" : '';
|
|
var T = H || m || S ? 'T' : '';
|
|
var result = "P" + Y + M + D + T + H + m + S;
|
|
return result === 'P' ? 'P0D' : result;
|
|
};
|
|
|
|
_proto.toJSON = function toJSON() {
|
|
return this.toISOString();
|
|
};
|
|
|
|
_proto.as = function as(unit) {
|
|
return this.$ms / (unitToMS[prettyUnit(unit)] || 1);
|
|
};
|
|
|
|
_proto.get = function get(unit) {
|
|
var base = this.$ms;
|
|
var pUnit = prettyUnit(unit);
|
|
|
|
if (pUnit === 'milliseconds') {
|
|
base %= 1000;
|
|
} else if (pUnit === 'weeks') {
|
|
base = Math.floor(base / unitToMS[pUnit]);
|
|
} else {
|
|
base = this.$d[pUnit];
|
|
}
|
|
|
|
return base;
|
|
};
|
|
|
|
_proto.add = function add(input, unit, isSubtract) {
|
|
var another;
|
|
|
|
if (unit) {
|
|
another = input * unitToMS[prettyUnit(unit)];
|
|
} else if (isDuration(input)) {
|
|
another = input.$ms;
|
|
} else {
|
|
another = wrapper(input, this).$ms;
|
|
}
|
|
|
|
return wrapper(this.$ms + another * (isSubtract ? -1 : 1), this);
|
|
};
|
|
|
|
_proto.subtract = function subtract(input, unit) {
|
|
return this.add(input, unit, true);
|
|
};
|
|
|
|
_proto.locale = function locale(l) {
|
|
var that = this.clone();
|
|
that.$l = l;
|
|
return that;
|
|
};
|
|
|
|
_proto.clone = function clone() {
|
|
return wrapper(this.$ms, this);
|
|
};
|
|
|
|
_proto.humanize = function humanize(withSuffix) {
|
|
return $d().add(this.$ms, 'ms').locale(this.$l).fromNow(!withSuffix);
|
|
};
|
|
|
|
_proto.milliseconds = function milliseconds() {
|
|
return this.get('milliseconds');
|
|
};
|
|
|
|
_proto.asMilliseconds = function asMilliseconds() {
|
|
return this.as('milliseconds');
|
|
};
|
|
|
|
_proto.seconds = function seconds() {
|
|
return this.get('seconds');
|
|
};
|
|
|
|
_proto.asSeconds = function asSeconds() {
|
|
return this.as('seconds');
|
|
};
|
|
|
|
_proto.minutes = function minutes() {
|
|
return this.get('minutes');
|
|
};
|
|
|
|
_proto.asMinutes = function asMinutes() {
|
|
return this.as('minutes');
|
|
};
|
|
|
|
_proto.hours = function hours() {
|
|
return this.get('hours');
|
|
};
|
|
|
|
_proto.asHours = function asHours() {
|
|
return this.as('hours');
|
|
};
|
|
|
|
_proto.days = function days() {
|
|
return this.get('days');
|
|
};
|
|
|
|
_proto.asDays = function asDays() {
|
|
return this.as('days');
|
|
};
|
|
|
|
_proto.weeks = function weeks() {
|
|
return this.get('weeks');
|
|
};
|
|
|
|
_proto.asWeeks = function asWeeks() {
|
|
return this.as('weeks');
|
|
};
|
|
|
|
_proto.months = function months() {
|
|
return this.get('months');
|
|
};
|
|
|
|
_proto.asMonths = function asMonths() {
|
|
return this.as('months');
|
|
};
|
|
|
|
_proto.years = function years() {
|
|
return this.get('years');
|
|
};
|
|
|
|
_proto.asYears = function asYears() {
|
|
return this.as('years');
|
|
};
|
|
|
|
return Duration;
|
|
}();
|
|
|
|
export default (function (option, Dayjs, dayjs) {
|
|
$d = dayjs;
|
|
$u = dayjs().$utils();
|
|
|
|
dayjs.duration = function (input, unit) {
|
|
var $l = dayjs.locale();
|
|
return wrapper(input, {
|
|
$l: $l
|
|
}, unit);
|
|
};
|
|
|
|
dayjs.isDuration = isDuration;
|
|
}); |