a tool for shared writing and social publishing
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}