vtils
Version:
一个面向业务的 JavaScript/TypeScript 实用程序库。
67 lines • 2.58 kB
JavaScript
import { compareAsc, differenceInDays, differenceInHours, differenceInMilliseconds, differenceInMinutes, differenceInMonths, differenceInSeconds, differenceInYears, isValid, sub } from 'date-fns';
import { anyToDate } from "./anyToDate.js";
// ref: https://github.com/date-fns/date-fns/blob/master/src/intervalToDuration/index.js
export function intervalToRestrictiveDuration(start, end, target) {
if (target === void 0) {
target = 'year';
}
var dateLeft = anyToDate(start);
var dateRight = anyToDate(end);
if (!isValid(dateLeft)) {
throw new RangeError('Start Date is invalid');
}
if (!isValid(dateRight)) {
throw new RangeError('End Date is invalid');
}
var duration = {
years: 0,
months: 0,
days: 0,
hours: 0,
minutes: 0,
seconds: 0,
milliseconds: 0
};
var remaining = dateLeft;
var sign = compareAsc(dateLeft, dateRight);
if (target === 'year') {
duration.years = Math.abs(differenceInYears(remaining, dateRight));
}
if (target === 'year' || target === 'month') {
remaining = sub(remaining, {
years: sign * duration.years
});
duration.months = Math.abs(differenceInMonths(remaining, dateRight));
}
if (target === 'year' || target === 'month' || target === 'day') {
remaining = sub(remaining, {
months: sign * duration.months
});
duration.days = Math.abs(differenceInDays(remaining, dateRight));
}
if (target === 'year' || target === 'month' || target === 'day' || target === 'hour') {
remaining = sub(remaining, {
days: sign * duration.days
});
duration.hours = Math.abs(differenceInHours(remaining, dateRight));
}
if (target === 'year' || target === 'month' || target === 'day' || target === 'hour' || target === 'minute') {
remaining = sub(remaining, {
hours: sign * duration.hours
});
duration.minutes = Math.abs(differenceInMinutes(remaining, dateRight));
}
if (target === 'year' || target === 'month' || target === 'day' || target === 'hour' || target === 'minute' || target === 'second') {
remaining = sub(remaining, {
minutes: sign * duration.minutes
});
duration.seconds = Math.abs(differenceInSeconds(remaining, dateRight));
}
if (target === 'year' || target === 'month' || target === 'day' || target === 'hour' || target === 'minute' || target === 'second' || target === 'millisecond') {
remaining = sub(remaining, {
seconds: sign * duration.seconds
});
duration.milliseconds = Math.abs(differenceInMilliseconds(remaining, dateRight));
}
return duration;
}