Skip to content

Commit 1dc5e03

Browse files
feat(releases): improve date formatting
1 parent d8a2240 commit 1dc5e03

File tree

2 files changed

+24
-26
lines changed

2 files changed

+24
-26
lines changed

src/routes/package/[...package]/+page.server.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ export async function load({ params }) {
7676
}
7777

7878
if (currentPackage) {
79-
// Return the final sorted results and filter back out the clean version
79+
// Return the final sorted results
8080
return {
8181
currentPackage,
8282
releases: releases.toSorted(

src/routes/package/[...package]/ReleaseCard.svelte

Lines changed: 23 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -63,32 +63,30 @@
6363
* e.g., "2 days ago", "3 hours ago", "1 minute ago"
6464
*
6565
* @param date The date to convert
66+
* @param locale the locale to use for formatting
6667
* @returns the relative date
6768
*/
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");
8888
}
89-
return new Intl.RelativeTimeFormat("en", {
90-
style: "long"
91-
}).format(-Math.ceil(dateDiff), relevantUnit);
89+
return formatter.format(0 - diff, "second");
9290
}
9391
</script>
9492

@@ -185,11 +183,11 @@
185183
month: "long",
186184
day: "numeric"
187185
})
188-
: toRelativeDateString(releaseDate)}
186+
: timeAgo(releaseDate)}
189187
</Tooltip.Trigger>
190188
<Tooltip.Content>
191189
{isOlderThanAWeek
192-
? toRelativeDateString(releaseDate)
190+
? timeAgo(releaseDate)
193191
: new Intl.DateTimeFormat("en", {
194192
dateStyle: "long",
195193
timeStyle: "short"

0 commit comments

Comments
 (0)