diff --git a/ts/lib/tslib/time.ts b/ts/lib/tslib/time.ts index a517e8a39..876f66b27 100644 --- a/ts/lib/tslib/time.ts +++ b/ts/lib/tslib/time.ts @@ -7,8 +7,8 @@ export const SECOND = 1.0; export const MINUTE = 60.0 * SECOND; export const HOUR = 60.0 * MINUTE; export const DAY = 24.0 * HOUR; -export const MONTH = 30.417 * DAY; // 365/12 ≈ 30.417 export const YEAR = 365.0 * DAY; +export const MONTH = YEAR / 12; export enum TimespanUnit { Seconds, @@ -36,21 +36,25 @@ export function unitName(unit: TimespanUnit): string { } } -export function naturalUnit(secs: number): TimespanUnit { +export function naturalUnit(secs: number, maxUnit: TimespanUnit = TimespanUnit.Years): TimespanUnit { secs = Math.abs(secs); - if (secs < MINUTE) { - return TimespanUnit.Seconds; - } else if (secs < HOUR) { - return TimespanUnit.Minutes; - } else if (secs < DAY) { - return TimespanUnit.Hours; - } else if (secs < MONTH) { - return TimespanUnit.Days; - } else if (secs < YEAR) { - return TimespanUnit.Months; - } else { - return TimespanUnit.Years; + const thresholds = [ + { unit: TimespanUnit.Years, min: YEAR }, + { unit: TimespanUnit.Months, min: MONTH }, + { unit: TimespanUnit.Days, min: DAY }, + { unit: TimespanUnit.Hours, min: HOUR }, + { unit: TimespanUnit.Minutes, min: MINUTE }, + { unit: TimespanUnit.Seconds, min: 0 }, + ]; + for (const { unit, min } of thresholds) { + if (unit > maxUnit) { + continue; + } + if (secs >= min) { + return unit; + } } + return TimespanUnit.Seconds; } /** Number of seconds in a given unit. */ @@ -146,8 +150,13 @@ function i18nFuncForUnit( If precise is true, show to two decimal places, eg eg 70 seconds -> "1.17 minutes" If false, seconds and days are shown without decimals. */ -export function timeSpan(seconds: number, short = false, precise = true): string { - const unit = naturalUnit(seconds); +export function timeSpan( + seconds: number, + short = false, + precise = true, + maxUnit: TimespanUnit = TimespanUnit.Years, +): string { + const unit = naturalUnit(seconds, maxUnit); let amount = unitAmount(unit, seconds); if (!precise && unit < TimespanUnit.Months) { amount = Math.round(amount);