@samual/duration
Version:
Normalize and format durations of time.
33 lines (32 loc) • 1.62 kB
JavaScript
import { DurationError } from "./DurationError.js"
class NormalizeDurationError extends DurationError {}
Object.defineProperty(NormalizeDurationError.prototype, "name", { value: "NormalizeDurationError" })
class NormalizeNonIntegerDurationError extends NormalizeDurationError {}
Object.defineProperty(NormalizeNonIntegerDurationError.prototype, "name", { value: "NormalizeDurationNonIntegerError" })
function normalizeDuration(duration) {
if (Object.values(duration).some(value => value && !Number.isInteger(value)))
throw new NormalizeNonIntegerDurationError("Given number must be an integer")
let milliseconds = duration.milliseconds ?? 0,
seconds = duration.seconds ?? 0,
minutes = duration.minutes ?? 0,
hours = duration.hours ?? 0,
days = duration.days ?? 0,
years = duration.years ?? 0
seconds += Math.floor(milliseconds / 1e3)
milliseconds %= 1e3
minutes += Math.floor(seconds / 60)
seconds %= 60
hours += Math.floor(minutes / 60)
minutes %= 60
days += Math.floor(hours / 24)
hours %= 24
years += Math.floor(days / 365)
days %= 365
null != duration.years ? (duration.years = years) : (days += 365 * years)
null != duration.days ? (duration.days = days) : (hours += 24 * days)
null != duration.hours ? (duration.hours = hours) : (minutes += 60 * hours)
null != duration.minutes ? (duration.minutes = minutes) : (seconds += 60 * minutes)
null != duration.seconds ? (duration.seconds = seconds) : (milliseconds += 1e3 * seconds)
null != duration.milliseconds && (duration.milliseconds = milliseconds)
}
export { NormalizeDurationError, NormalizeNonIntegerDurationError, normalizeDuration }