UNPKG

daet

Version:

Minimal immutable date class that supports relative time, calendar time, and plus/minus of different units.

91 lines (90 loc) 2.9 kB
import { Hour, Minute, Second } from './index.js'; export function rightNow() { return 'right now'; } export function relativeTicks({ past, ticks, }) { return past ? `${ticks} ago` : `in ${ticks}`; } export function seconds({ seconds }) { return `${seconds} ${seconds > 1 ? 'seconds' : 'second'}`; } export function relativeSeconds(opts) { const ticks = seconds({ seconds: opts.seconds }); return relativeTicks({ past: opts.past, ticks }); } export function minutes({ minutes }) { return `${minutes} ${minutes > 1 ? 'minutes' : 'minute'}`; } export function relativeMinutes(opts) { const ticks = minutes({ minutes: opts.minutes }); return relativeTicks({ past: opts.past, ticks }); } export function hours({ hours }) { return `${hours} ${hours > 1 ? 'hours' : 'hour'}`; } export function hoursAndMinutes(opts) { return hours(opts) + (opts.minutes ? ' ' + minutes(opts) : ''); } export function yesterdayOrTommorow({ past }) { return past ? 'yesterday' : 'tomorrow'; } export function relativeHoursAndMinutes(opts) { const ticks = hoursAndMinutes({ hours: opts.hours, minutes: opts.minutes }); return relativeTicks({ past: opts.past, ticks }); } export function relativeDelta(opts) { if (opts.delta < Minute) { const seconds = Math.floor(opts.delta / Second); if (seconds) return relativeSeconds({ past: opts.past, seconds }); } const hours = Math.floor(opts.delta / Hour); const minutes = Math.floor((opts.delta - hours * Hour) / Minute); if (hours) return relativeHoursAndMinutes({ past: opts.past, hours, minutes }); if (minutes) return relativeMinutes({ past: opts.past, minutes }); return rightNow(); } export function weekdayThisWeek({ weekday }) { return `this ${weekday}`; } export function weekdayNextWeek({ weekday }) { return `next ${weekday}`; } export function fewSeconds({ past }) { return past ? 'a few seconds ago' : 'in a few seconds'; } export function underMinute({ past }) { return past ? 'under a minute ago' : 'in under a minute'; } export function earlierOrLaterToday({ past }) { return past ? 'earlier today' : 'later today'; } export function earlierOrLater({ past }) { return past ? 'sometime earlier' : 'sometime later'; } export function earlierThisWeek() { return 'earlier this week'; } export function earlierLastWeek() { return 'earlier last week'; } export function relativeThisWeek({ past, when, }) { return past ? earlierThisWeek() : weekdayThisWeek({ weekday: when.format('en', { weekday: 'long', }), }); } export function relativeSecondWeek({ past, when, }) { return past ? earlierLastWeek() : weekdayNextWeek({ weekday: when.format('en', { weekday: 'long', }), }); }