Relative Date Time Display
Render a user friendly relative time string with either one or two date values. If only one date value is passed, it is relative to Date.now(). The optional second parameter allows your base date to be adjusted.
Source
relative-time.js
const rtf = new Intl.RelativeTimeFormat("en", { numeric: "auto" });
const TIME_UNITS = {
year: 24 * 60 * 60 * 1000 * 365,
month: (24 * 60 * 60 * 1000 * 365) / 12,
day: 24 * 60 * 60 * 1000,
hour: 60 * 60 * 1000,
minute: 60 * 1000,
second: 1000
};
const getRelativeTime = (d1, d2 = new Date()) => {
const elapsed = d1 - d2;
// "Math.abs" accounts for both "past" & "future" scenarios
for (var u in TIME_UNITS) {
if (Math.abs(elapsed) > TIME_UNITS[u] || u == "second") {
return rtf.format(Math.round(elapsed / TIME_UNITS[u]), u);
}
}
};Usage
example-usage.js
// in the past
getRelativeTime(Date.now() - 10000) // 10 seconds ago
getRelativeTime(Date.now() - 100000) // 2 minutes ago
getRelativeTime(Date.now() - 10000000) // 3 hours ago
getRelativeTime(Date.now() - 100**4) // yesterday
getRelativeTime(Date.now() - 110**4) // 2 days ago
getRelativeTime(Date.now() - 80**5) // last month
getRelativeTime(Date.now() - 50**6) // 6 months ago
getRelativeTime(Date.now() - 60**6) // last year
getRelativeTime(Date.now() - 15**10) // 18 years ago
// in the future
getRelativeTime(Date.now() + 10000) // in 10 seconds
getRelativeTime(Date.now() + 100000) // in 2 minutes
getRelativeTime(Date.now() + 60**6) // next year
getRelativeTime(Date.now() + 15**10) // in 18 years