// Modified from https://gist.github.com/IbeVanmeenen/4e3e58820c9168806e57530563612886 // which is based on https://stackoverflow.com/questions/3177836/how-to-format-time-since-xxx-e-g-4-minutes-ago-similar-to-stack-exchange-site const epochs = [ ["year", 31536000], ["month", 2592000], ["day", 86400], ["hour", 3600], ["minute", 60], ["second", 1] ] as const const getDuration = (timeAgoInSeconds: number) => { for (let [name, seconds] of epochs) { const interval = Math.floor(timeAgoInSeconds / seconds) if (interval >= 1) { return { interval: interval, epoch: name } } } return { interval: 0, epoch: "second" } } const timeAgo = (date: Date) => { const timeAgoInSeconds = Math.floor( (new Date().getTime() - new Date(date).getTime()) / 1000 ) const { interval, epoch } = getDuration(timeAgoInSeconds) const suffix = interval === 1 ? "" : "s" return `${interval} ${epoch}${suffix} ago` } const timeUntil = (date: Date) => { const timeUntilInSeconds = Math.floor( (new Date(date).getTime() - new Date().getTime()) / 1000 ) const { interval, epoch } = getDuration(timeUntilInSeconds) const suffix = interval === 1 ? "" : "s" return `in ${interval} ${epoch}${suffix}` } export { timeAgo, timeUntil }