Add maxUnit argument to naturalUnit

This commit is contained in:
user1823 2025-06-15 12:58:17 +05:30
parent 615bbf95a1
commit 0a3adf02b0

View file

@ -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);