Files
2026-07-13 13:32:57 +08:00

41 lines
864 B
TypeScript

// Formats duration in a human readable way, some examples:
// 1h 30m
// 1m 30s
// 1h
// Uses built-in plain Date object, so it's not timezone aware
export function PrettyDuration({
startAt,
endAt,
fallback,
}: {
startAt?: Date | null;
endAt?: Date | null;
fallback?: string;
}) {
if (!startAt || !endAt) {
return <>{fallback ?? "-"}</>;
}
const duration = Math.abs(endAt.getTime() - startAt.getTime());
const hours = Math.floor(duration / (1000 * 60 * 60));
const minutes = Math.floor((duration / (1000 * 60)) % 60);
const seconds = Math.floor((duration / 1000) % 60);
const durationParts = [];
if (hours > 0) {
durationParts.push(`${hours}h`);
}
if (minutes > 0) {
durationParts.push(`${minutes}m`);
}
if (seconds > 0) {
durationParts.push(`${seconds}s`);
}
return <>{durationParts.join(" ")}</>;
}