58 lines
2.1 KiB
TypeScript
58 lines
2.1 KiB
TypeScript
export function formatRelativeTime(date: Date | string | number): string {
|
|
const now = new Date();
|
|
const target = new Date(date);
|
|
const diffMs = now.getTime() - target.getTime();
|
|
if (diffMs < 0)
|
|
return "just now";
|
|
const seconds = Math.floor(diffMs / 1000);
|
|
const minutes = Math.floor(seconds / 60);
|
|
const hours = Math.floor(minutes / 60);
|
|
const days = Math.floor(hours / 24);
|
|
const weeks = Math.floor(days / 7);
|
|
const months = Math.floor(days / 30);
|
|
const years = Math.floor(days / 365);
|
|
const parts: string[] = [];
|
|
if (years > 0) {
|
|
parts.push(`${years} ${years === 1 ? "year" : "years"}`);
|
|
const remainingMonths = Math.floor((days % 365) / 30);
|
|
if (remainingMonths > 0) {
|
|
parts.push(`${remainingMonths} ${remainingMonths === 1 ? "month" : "months"}`);
|
|
}
|
|
}
|
|
else if (months > 0) {
|
|
parts.push(`${months} ${months === 1 ? "month" : "months"}`);
|
|
const remainingDays = days % 30;
|
|
if (remainingDays > 0) {
|
|
parts.push(`${remainingDays} ${remainingDays === 1 ? "day" : "days"}`);
|
|
}
|
|
}
|
|
else if (weeks > 0) {
|
|
parts.push(`${weeks} ${weeks === 1 ? "week" : "weeks"}`);
|
|
const remainingDays = days % 7;
|
|
if (remainingDays > 0) {
|
|
parts.push(`${remainingDays} ${remainingDays === 1 ? "day" : "days"}`);
|
|
}
|
|
}
|
|
else if (days > 0) {
|
|
parts.push(`${days} ${days === 1 ? "day" : "days"}`);
|
|
const remainingHours = hours % 24;
|
|
if (remainingHours > 0) {
|
|
parts.push(`${remainingHours} ${remainingHours === 1 ? "hour" : "hours"}`);
|
|
}
|
|
}
|
|
else if (hours > 0) {
|
|
parts.push(`${hours} ${hours === 1 ? "hour" : "hours"}`);
|
|
const remainingMinutes = minutes % 60;
|
|
if (remainingMinutes > 0) {
|
|
parts.push(`${remainingMinutes} ${remainingMinutes === 1 ? "minute" : "minutes"}`);
|
|
}
|
|
}
|
|
else if (minutes > 0) {
|
|
parts.push(`${minutes} ${minutes === 1 ? "minute" : "minutes"}`);
|
|
}
|
|
else {
|
|
return "just now";
|
|
}
|
|
return "Released " + parts.slice(0, 2).join(" ") + " ago";
|
|
}
|