npm
Version:
a package manager for JavaScript
113 lines (89 loc) • 2.78 kB
JavaScript
const calculateDelta = (now, date) => Math.round(Math.abs(now - date) / 1000)
const minute = 60
const hour = minute * 60
const day = hour * 24
const week = day * 7
const month = day * 30
const year = day * 365
export default function relativeDateFactory (translations) {
const translate = (date, now, translatePhrase, timeValue, rawValue) => {
let key
if (translatePhrase === 'justNow') {
key = translatePhrase
} else if (now >= date) {
key = `${translatePhrase}Ago`
} else {
key = `${translatePhrase}FromNow`
}
const translation = translations[key]
if (typeof translation === 'function') {
return translation(timeValue, rawValue)
}
return translation.replace('{{time}}', timeValue)
}
return function relativeDate (date, now = new Date()) {
if (!(date instanceof Date)) {
date = new Date(date)
}
let delta = calculateDelta(now, date)
if (delta > day && delta < week) {
date = new Date(
date.getFullYear(),
date.getMonth(),
date.getDate(),
0,
0,
0
)
delta = calculateDelta(now, date)
}
switch (false) {
case !(delta < 30):
return translate(date, now, 'justNow', delta, delta)
case !(delta < minute):
return translate(date, now, 'seconds', delta, delta)
case !(delta < 2 * minute):
return translate(date, now, 'aMinute', 1, delta)
case !(delta < hour):
return translate(
date,
now,
'minutes',
Math.floor(delta / minute),
delta
)
case Math.floor(delta / hour) !== 1:
return translate(
date,
now,
'anHour',
Math.floor(delta / minute),
delta
)
case !(delta < day):
return translate(date, now, 'hours', Math.floor(delta / hour), delta)
case !(delta < day * 2):
return translate(date, now, 'aDay', 1, delta)
case !(delta < week):
return translate(date, now, 'days', Math.floor(delta / day), delta)
case Math.floor(delta / week) !== 1:
return translate(date, now, 'aWeek', 1, delta)
case !(delta < month):
return translate(date, now, 'weeks', Math.floor(delta / week), delta)
case Math.floor(delta / month) !== 1:
return translate(date, now, 'aMonth', 1, delta)
case !(delta < year):
return translate(date, now, 'months', Math.floor(delta / month), delta)
case Math.floor(delta / year) !== 1:
return translate(date, now, 'aYear', 1, delta)
default:
return translate(
date,
now,
'overAYear',
Math.floor(delta / year),
delta
)
}
}
}