Files
2026-01-04 17:57:07 +01:00

52 lines
1.5 KiB
TypeScript

type RelativeTimeInput = string | number | Date | null | undefined;
const relativeTimeFormatter = new Intl.RelativeTimeFormat("en", { numeric: "auto" });
const parseRelativeTime = (value: RelativeTimeInput) => {
if (value === null || value === undefined) {
return null;
}
const date = value instanceof Date ? value : new Date(value);
const timestamp = date.getTime();
if (Number.isNaN(timestamp)) {
return null;
}
return timestamp;
};
export const formatRelativeTime = (value: RelativeTimeInput) => {
const timestamp = parseRelativeTime(value);
if (timestamp === null) {
return null;
}
const diffSeconds = Math.round((timestamp - Date.now()) / 1000);
const absSeconds = Math.abs(diffSeconds);
if (absSeconds < 60) {
return relativeTimeFormatter.format(diffSeconds, "second");
}
const diffMinutes = Math.round(diffSeconds / 60);
if (Math.abs(diffMinutes) < 60) {
return relativeTimeFormatter.format(diffMinutes, "minute");
}
const diffHours = Math.round(diffMinutes / 60);
if (Math.abs(diffHours) < 24) {
return relativeTimeFormatter.format(diffHours, "hour");
}
const diffDays = Math.round(diffHours / 24);
if (Math.abs(diffDays) < 30) {
return relativeTimeFormatter.format(diffDays, "day");
}
const diffMonths = Math.round(diffDays / 30);
if (Math.abs(diffMonths) < 12) {
return relativeTimeFormatter.format(diffMonths, "month");
}
const diffYears = Math.round(diffDays / 365);
return relativeTimeFormatter.format(diffYears, "year");
};