|
63 | 63 | * e.g., "2 days ago", "3 hours ago", "1 minute ago" |
64 | 64 | * |
65 | 65 | * @param date The date to convert |
| 66 | + * @param locale the locale to use for formatting |
66 | 67 | * @returns the relative date |
67 | 68 | */ |
68 | | - export function toRelativeDateString(date: Date) { |
69 | | - let dateDiff = new Date().getTime() - date.getTime(); |
70 | | - let relevantUnit: Intl.RelativeTimeFormatUnit; |
71 | | - switch (true) { |
72 | | - case dateDiff < 1000 * 60: |
73 | | - dateDiff /= 1000; |
74 | | - relevantUnit = "seconds"; |
75 | | - break; |
76 | | - case dateDiff < 1000 * 60 * 60: |
77 | | - dateDiff /= 1000 * 60; |
78 | | - relevantUnit = "minutes"; |
79 | | - break; |
80 | | - case dateDiff < 1000 * 60 * 60 * 24: |
81 | | - dateDiff /= 1000 * 60 * 60; |
82 | | - relevantUnit = "hours"; |
83 | | - break; |
84 | | - default: |
85 | | - dateDiff /= 1000 * 60 * 60 * 24; |
86 | | - relevantUnit = "days"; |
87 | | - break; |
| 69 | + function timeAgo(date: Date, locale = "en") { |
| 70 | + const diff = (new Date().getTime() - date.getTime()) / 1000; |
| 71 | + const minutes = Math.floor(diff / 60); |
| 72 | + const hours = Math.floor(minutes / 60); |
| 73 | + const days = Math.floor(hours / 24); |
| 74 | + const months = Math.floor(days / 30); |
| 75 | + const years = Math.floor(months / 12); |
| 76 | + const formatter = new Intl.RelativeTimeFormat(locale); |
| 77 | +
|
| 78 | + if (years > 0) { |
| 79 | + return formatter.format(0 - years, "year"); |
| 80 | + } else if (months > 0) { |
| 81 | + return formatter.format(0 - months, "month"); |
| 82 | + } else if (days > 0) { |
| 83 | + return formatter.format(0 - days, "day"); |
| 84 | + } else if (hours > 0) { |
| 85 | + return formatter.format(0 - hours, "hour"); |
| 86 | + } else if (minutes > 0) { |
| 87 | + return formatter.format(0 - minutes, "minute"); |
88 | 88 | } |
89 | | - return new Intl.RelativeTimeFormat("en", { |
90 | | - style: "long" |
91 | | - }).format(-Math.ceil(dateDiff), relevantUnit); |
| 89 | + return formatter.format(0 - diff, "second"); |
92 | 90 | } |
93 | 91 | </script> |
94 | 92 |
|
|
185 | 183 | month: "long", |
186 | 184 | day: "numeric" |
187 | 185 | }) |
188 | | - : toRelativeDateString(releaseDate)} |
| 186 | + : timeAgo(releaseDate)} |
189 | 187 | </Tooltip.Trigger> |
190 | 188 | <Tooltip.Content> |
191 | 189 | {isOlderThanAWeek |
192 | | - ? toRelativeDateString(releaseDate) |
| 190 | + ? timeAgo(releaseDate) |
193 | 191 | : new Intl.DateTimeFormat("en", { |
194 | 192 | dateStyle: "long", |
195 | 193 | timeStyle: "short" |
|
0 commit comments