UNPKG

luxon

Version:
234 lines (209 loc) 5.82 kB
import * as Formats from "./formats.js"; import { pick } from "./util.js"; function stringify(obj) { return JSON.stringify(obj, Object.keys(obj).sort()); } /** * @private */ export const monthsLong = [ "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December", ]; export const monthsShort = [ "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec", ]; export const monthsNarrow = ["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"]; export function months(length) { switch (length) { case "narrow": return [...monthsNarrow]; case "short": return [...monthsShort]; case "long": return [...monthsLong]; case "numeric": return ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"]; case "2-digit": return ["01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12"]; default: return null; } } export const weekdaysLong = [ "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday", ]; export const weekdaysShort = ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"]; export const weekdaysNarrow = ["M", "T", "W", "T", "F", "S", "S"]; export function weekdays(length) { switch (length) { case "narrow": return [...weekdaysNarrow]; case "short": return [...weekdaysShort]; case "long": return [...weekdaysLong]; case "numeric": return ["1", "2", "3", "4", "5", "6", "7"]; default: return null; } } export const meridiems = ["AM", "PM"]; export const erasLong = ["Before Christ", "Anno Domini"]; export const erasShort = ["BC", "AD"]; export const erasNarrow = ["B", "A"]; export function eras(length) { switch (length) { case "narrow": return [...erasNarrow]; case "short": return [...erasShort]; case "long": return [...erasLong]; default: return null; } } export function meridiemForDateTime(dt) { return meridiems[dt.hour < 12 ? 0 : 1]; } export function weekdayForDateTime(dt, length) { return weekdays(length)[dt.weekday - 1]; } export function monthForDateTime(dt, length) { return months(length)[dt.month - 1]; } export function eraForDateTime(dt, length) { return eras(length)[dt.year < 0 ? 0 : 1]; } export function formatRelativeTime(unit, count, numeric = "always", narrow = false) { const units = { years: ["year", "yr."], quarters: ["quarter", "qtr."], months: ["month", "mo."], weeks: ["week", "wk."], days: ["day", "day", "days"], hours: ["hour", "hr."], minutes: ["minute", "min."], seconds: ["second", "sec."], }; const lastable = ["hours", "minutes", "seconds"].indexOf(unit) === -1; if (numeric === "auto" && lastable) { const isDay = unit === "days"; switch (count) { case 1: return isDay ? "tomorrow" : `next ${units[unit][0]}`; case -1: return isDay ? "yesterday" : `last ${units[unit][0]}`; case 0: return isDay ? "today" : `this ${units[unit][0]}`; default: // fall through } } const isInPast = Object.is(count, -0) || count < 0, fmtValue = Math.abs(count), singular = fmtValue === 1, lilUnits = units[unit], fmtUnit = narrow ? singular ? lilUnits[1] : lilUnits[2] || lilUnits[1] : singular ? units[unit][0] : unit; return isInPast ? `${fmtValue} ${fmtUnit} ago` : `in ${fmtValue} ${fmtUnit}`; } export function formatString(knownFormat) { // these all have the offsets removed because we don't have access to them // without all the intl stuff this is backfilling const filtered = pick(knownFormat, [ "weekday", "era", "year", "month", "day", "hour", "minute", "second", "timeZoneName", "hourCycle", ]), key = stringify(filtered), dateTimeHuge = "EEEE, LLLL d, yyyy, h:mm a"; switch (key) { case stringify(Formats.DATE_SHORT): return "M/d/yyyy"; case stringify(Formats.DATE_MED): return "LLL d, yyyy"; case stringify(Formats.DATE_MED_WITH_WEEKDAY): return "EEE, LLL d, yyyy"; case stringify(Formats.DATE_FULL): return "LLLL d, yyyy"; case stringify(Formats.DATE_HUGE): return "EEEE, LLLL d, yyyy"; case stringify(Formats.TIME_SIMPLE): return "h:mm a"; case stringify(Formats.TIME_WITH_SECONDS): return "h:mm:ss a"; case stringify(Formats.TIME_WITH_SHORT_OFFSET): return "h:mm a"; case stringify(Formats.TIME_WITH_LONG_OFFSET): return "h:mm a"; case stringify(Formats.TIME_24_SIMPLE): return "HH:mm"; case stringify(Formats.TIME_24_WITH_SECONDS): return "HH:mm:ss"; case stringify(Formats.TIME_24_WITH_SHORT_OFFSET): return "HH:mm"; case stringify(Formats.TIME_24_WITH_LONG_OFFSET): return "HH:mm"; case stringify(Formats.DATETIME_SHORT): return "M/d/yyyy, h:mm a"; case stringify(Formats.DATETIME_MED): return "LLL d, yyyy, h:mm a"; case stringify(Formats.DATETIME_FULL): return "LLLL d, yyyy, h:mm a"; case stringify(Formats.DATETIME_HUGE): return dateTimeHuge; case stringify(Formats.DATETIME_SHORT_WITH_SECONDS): return "M/d/yyyy, h:mm:ss a"; case stringify(Formats.DATETIME_MED_WITH_SECONDS): return "LLL d, yyyy, h:mm:ss a"; case stringify(Formats.DATETIME_MED_WITH_WEEKDAY): return "EEE, d LLL yyyy, h:mm a"; case stringify(Formats.DATETIME_FULL_WITH_SECONDS): return "LLLL d, yyyy, h:mm:ss a"; case stringify(Formats.DATETIME_HUGE_WITH_SECONDS): return "EEEE, LLLL d, yyyy, h:mm:ss a"; default: return dateTimeHuge; } }