You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
345 lines
8.6 KiB
345 lines
8.6 KiB
import { MILLISECONDS_A_DAY, MILLISECONDS_A_HOUR, MILLISECONDS_A_MINUTE, MILLISECONDS_A_SECOND, MILLISECONDS_A_WEEK, REGEX_FORMAT } 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 isNegative = function isNegative(number) { |
|
return number < 0; |
|
}; |
|
|
|
var roundNumber = function roundNumber(number) { |
|
return isNegative(number) ? Math.ceil(number) : Math.floor(number); |
|
}; |
|
|
|
var absolute = function absolute(number) { |
|
return Math.abs(number); |
|
}; |
|
|
|
var getNumberUnitFormat = function getNumberUnitFormat(number, unit) { |
|
if (!number) { |
|
return { |
|
negative: false, |
|
format: '' |
|
}; |
|
} |
|
|
|
if (isNegative(number)) { |
|
return { |
|
negative: true, |
|
format: "" + absolute(number) + unit |
|
}; |
|
} |
|
|
|
return { |
|
negative: false, |
|
format: "" + number + unit |
|
}; |
|
}; |
|
|
|
var Duration = /*#__PURE__*/function () { |
|
function Duration(input, unit, locale) { |
|
var _this = this; |
|
|
|
this.$d = {}; |
|
this.$l = locale; |
|
|
|
if (input === undefined) { |
|
this.$ms = 0; |
|
this.parseFromMilliseconds(); |
|
} |
|
|
|
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) { |
|
var properties = d.slice(2); |
|
var numberD = properties.map(function (value) { |
|
return value != null ? Number(value) : 0; |
|
}); |
|
this.$d.years = numberD[0]; |
|
this.$d.months = numberD[1]; |
|
this.$d.weeks = numberD[2]; |
|
this.$d.days = numberD[3]; |
|
this.$d.hours = numberD[4]; |
|
this.$d.minutes = numberD[5]; |
|
this.$d.seconds = numberD[6]; |
|
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]; |
|
}, 0); |
|
}; |
|
|
|
_proto.parseFromMilliseconds = function parseFromMilliseconds() { |
|
var $ms = this.$ms; |
|
this.$d.years = roundNumber($ms / MILLISECONDS_A_YEAR); |
|
$ms %= MILLISECONDS_A_YEAR; |
|
this.$d.months = roundNumber($ms / MILLISECONDS_A_MONTH); |
|
$ms %= MILLISECONDS_A_MONTH; |
|
this.$d.days = roundNumber($ms / MILLISECONDS_A_DAY); |
|
$ms %= MILLISECONDS_A_DAY; |
|
this.$d.hours = roundNumber($ms / MILLISECONDS_A_HOUR); |
|
$ms %= MILLISECONDS_A_HOUR; |
|
this.$d.minutes = roundNumber($ms / MILLISECONDS_A_MINUTE); |
|
$ms %= MILLISECONDS_A_MINUTE; |
|
this.$d.seconds = roundNumber($ms / MILLISECONDS_A_SECOND); |
|
$ms %= MILLISECONDS_A_SECOND; |
|
this.$d.milliseconds = $ms; |
|
}; |
|
|
|
_proto.toISOString = function toISOString() { |
|
var Y = getNumberUnitFormat(this.$d.years, 'Y'); |
|
var M = getNumberUnitFormat(this.$d.months, 'M'); |
|
var days = +this.$d.days || 0; |
|
|
|
if (this.$d.weeks) { |
|
days += this.$d.weeks * 7; |
|
} |
|
|
|
var D = getNumberUnitFormat(days, 'D'); |
|
var H = getNumberUnitFormat(this.$d.hours, 'H'); |
|
var m = getNumberUnitFormat(this.$d.minutes, 'M'); |
|
var seconds = this.$d.seconds || 0; |
|
|
|
if (this.$d.milliseconds) { |
|
seconds += this.$d.milliseconds / 1000; |
|
} |
|
|
|
var S = getNumberUnitFormat(seconds, 'S'); |
|
var negativeMode = Y.negative || M.negative || D.negative || H.negative || m.negative || S.negative; |
|
var T = H.format || m.format || S.format ? 'T' : ''; |
|
var P = negativeMode ? '-' : ''; |
|
var result = P + "P" + Y.format + M.format + D.format + T + H.format + m.format + S.format; |
|
return result === 'P' || result === '-P' ? 'P0D' : result; |
|
}; |
|
|
|
_proto.toJSON = function toJSON() { |
|
return this.toISOString(); |
|
}; |
|
|
|
_proto.format = function format(formatStr) { |
|
var str = formatStr || 'YYYY-MM-DDTHH:mm:ss'; |
|
var matches = { |
|
Y: this.$d.years, |
|
YY: $u.s(this.$d.years, 2, '0'), |
|
YYYY: $u.s(this.$d.years, 4, '0'), |
|
M: this.$d.months, |
|
MM: $u.s(this.$d.months, 2, '0'), |
|
D: this.$d.days, |
|
DD: $u.s(this.$d.days, 2, '0'), |
|
H: this.$d.hours, |
|
HH: $u.s(this.$d.hours, 2, '0'), |
|
m: this.$d.minutes, |
|
mm: $u.s(this.$d.minutes, 2, '0'), |
|
s: this.$d.seconds, |
|
ss: $u.s(this.$d.seconds, 2, '0'), |
|
SSS: $u.s(this.$d.milliseconds, 3, '0') |
|
}; |
|
return str.replace(REGEX_FORMAT, function (match, $1) { |
|
return $1 || String(matches[match]); |
|
}); |
|
}; |
|
|
|
_proto.as = function as(unit) { |
|
return this.$ms / unitToMS[prettyUnit(unit)]; |
|
}; |
|
|
|
_proto.get = function get(unit) { |
|
var base = this.$ms; |
|
var pUnit = prettyUnit(unit); |
|
|
|
if (pUnit === 'milliseconds') { |
|
base %= 1000; |
|
} else if (pUnit === 'weeks') { |
|
base = roundNumber(base / unitToMS[pUnit]); |
|
} else { |
|
base = this.$d[pUnit]; |
|
} |
|
|
|
return base === 0 ? 0 : base; // a === 0 will be true on both 0 and -0 |
|
}; |
|
|
|
_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.valueOf = function valueOf() { |
|
return this.asMilliseconds(); |
|
}; |
|
|
|
_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; |
|
var oldAdd = Dayjs.prototype.add; |
|
var oldSubtract = Dayjs.prototype.subtract; |
|
|
|
Dayjs.prototype.add = function (value, unit) { |
|
if (isDuration(value)) value = value.asMilliseconds(); |
|
return oldAdd.bind(this)(value, unit); |
|
}; |
|
|
|
Dayjs.prototype.subtract = function (value, unit) { |
|
if (isDuration(value)) value = value.asMilliseconds(); |
|
return oldSubtract.bind(this)(value, unit); |
|
}; |
|
}); |