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.

46 lines
1.1 KiB

const toZeroIfInfinity = value => Number.isFinite(value) ? value : 0;
function parseNumber(milliseconds) {
return {
days: Math.trunc(milliseconds / 86_400_000),
hours: Math.trunc(milliseconds / 3_600_000 % 24),
minutes: Math.trunc(milliseconds / 60_000 % 60),
seconds: Math.trunc(milliseconds / 1000 % 60),
milliseconds: Math.trunc(milliseconds % 1000),
microseconds: Math.trunc(toZeroIfInfinity(milliseconds * 1000) % 1000),
nanoseconds: Math.trunc(toZeroIfInfinity(milliseconds * 1e6) % 1000),
};
}
function parseBigint(milliseconds) {
return {
days: milliseconds / 86_400_000n,
hours: milliseconds / 3_600_000n % 24n,
minutes: milliseconds / 60_000n % 60n,
seconds: milliseconds / 1000n % 60n,
milliseconds: milliseconds % 1000n,
microseconds: 0n,
nanoseconds: 0n,
};
}
export default function parseMilliseconds(milliseconds) {
switch (typeof milliseconds) {
case 'number': {
if (Number.isFinite(milliseconds)) {
return parseNumber(milliseconds);
}
break;
}
case 'bigint': {
return parseBigint(milliseconds);
}
// No default
}
throw new TypeError('Expected a finite number or bigint');
}