a tool for shared writing and social publishing
at update/thread-viewer 50 lines 1.6 kB view raw
1export function timeAgo( 2 timestamp: string, 3 options?: { compact?: boolean }, 4): string { 5 const { compact } = options ?? {}; 6 const now = new Date(); 7 const date = new Date(timestamp); 8 const diffMs = now.getTime() - date.getTime(); 9 const diffSeconds = Math.floor(diffMs / 1000); 10 const diffMinutes = Math.floor(diffSeconds / 60); 11 const diffHours = Math.floor(diffMinutes / 60); 12 const diffDays = Math.floor(diffHours / 24); 13 const diffWeeks = Math.floor(diffDays / 7); 14 const diffMonths = Math.floor(diffDays / 30); 15 const diffYears = Math.floor(diffDays / 365); 16 17 if (compact) { 18 if (diffYears > 0) { 19 return `${diffYears}y`; 20 } else if (diffMonths > 0) { 21 return `${diffMonths}mo`; 22 } else if (diffWeeks > 0) { 23 return `${diffWeeks}w`; 24 } else if (diffDays > 0) { 25 return `${diffDays}d`; 26 } else if (diffHours > 0) { 27 return `${diffHours}h`; 28 } else if (diffMinutes > 0) { 29 return `${diffMinutes}m`; 30 } else { 31 return "now"; 32 } 33 } 34 35 if (diffYears > 0) { 36 return `${diffYears} year${diffYears === 1 ? "" : "s"} ago`; 37 } else if (diffMonths > 0) { 38 return `${diffMonths} month${diffMonths === 1 ? "" : "s"} ago`; 39 } else if (diffWeeks > 0) { 40 return `${diffWeeks} week${diffWeeks === 1 ? "" : "s"} ago`; 41 } else if (diffDays > 0) { 42 return `${diffDays} day${diffDays === 1 ? "" : "s"} ago`; 43 } else if (diffHours > 0) { 44 return `${diffHours} hour${diffHours === 1 ? "" : "s"} ago`; 45 } else if (diffMinutes > 0) { 46 return `${diffMinutes} minute${diffMinutes === 1 ? "" : "s"} ago`; 47 } else { 48 return "just now"; 49 } 50}