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
JavaScript
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',
}),
});
}