UNPKG

datezone

Version:

A lightweight and comprehensive date and timeZone utility library for JavaScript.

879 lines 20.8 kB
import { dayOfWeekBase, dayOfYearBase, getDayPeriod, weekDayName, } from "./day.pub.js"; import { to12Hour } from "./hour.pub.js"; import { getMonthName } from "./month.pub.js"; import { formatOrdinal } from "./ordinal.pub.js"; import { getISOWeekYearBase, weekBase } from "./week.pub.js"; import { quarter } from "./year.pub.js"; /** * Formats a timeZone offset as a GMT string. * @param offset - The timeZone offset in minutes. * @param long - Whether to use the long format (with zero-padded hours and minutes). * @returns The formatted GMT string. */ export function formatGMT(offset, long) { const sign = offset < 0 ? "-" : "+"; const abs = Math.abs(offset); const h = Math.floor(abs / 60); const m = abs % 60; if (long) { return `GMT${sign}${padZeros(h, 2)}:${padZeros(m, 2)}`; } return m === 0 ? `GMT${sign}${h}` : `GMT${sign}${h}:${padZeros(m, 2)}`; } /** * Formats a DT object as a timestamp string. * @param dt - The DT object. * @param ms - Whether to include milliseconds (true for ms, false for seconds). * @returns The formatted timestamp string. */ export function formatTimestamp(dt, ms) { const d = Date.UTC(dt.year, dt.month - 1, dt.day, dt.hour, dt.minute, dt.second, dt.millisecond); return ms ? String(d) : String(Math.floor(d / 1000)); } /** * Pads a number with leading zeros to the specified length. * @param n - The number to pad. * @param len - The desired length of the output string. * @returns The padded string. */ export function padZeros(n, len) { return n.toString().padStart(len, "0"); } /** * Timezone (ISO-8601 w/o Z) */ /** * Formats a timeZone offset according to the given pattern. * @param offset - The timeZone offset in minutes. * @param pattern - The pattern string (e.g., "X", "XX", "XXX", etc.). * @returns The formatted timeZone string. */ export function formatTimezone(offset, pattern) { if (offset === 0 && pattern[0].toUpperCase() === "X") return "Z"; const sign = offset < 0 ? "-" : "+"; const abs = Math.abs(offset); const h = Math.floor(abs / 60); const m = abs % 60; switch (pattern.length) { case 1: // X/x return `${sign}${padZeros(h, 2)}`; case 2: // XX/xx return `${sign}${padZeros(h, 2)}${padZeros(m, 2)}`; case 3: // XXX/xxx return `${sign}${padZeros(h, 2)}:${padZeros(m, 2)}`; case 4: // XXXX/xxxx return `${sign}${padZeros(h, 2)}${padZeros(m, 2)}`; case 5: // XXXXX/xxxxx return `${sign}${padZeros(h, 2)}:${padZeros(m, 2)}`; default: return `${sign}${padZeros(h, 2)}:${padZeros(m, 2)}`; } } /** * Era */ function G(o) { return o.dt.year > 0 ? (o.len >= 4 ? "AD" : "AD") : o.len >= 4 ? "BC" : "BC"; } function GG(o) { return G(o); } function GGG(o) { return G(o); } function GGGG(o) { return o.dt.year > 0 ? "Anno Domini" : "Before Christ"; } function GGGGG(o) { return o.dt.year > 0 ? "A" : "B"; } /** * Calendar year */ function y(o) { const year = o.dt.year; return year < 0 ? String(Math.abs(year)) : String(year); } function yy(o) { const year = o.dt.year; return padZeros((year < 0 ? Math.abs(year) : year) % 100, 2); } function yyy(o) { const year = o.dt.year; return padZeros(year < 0 ? Math.abs(year) : year, 3); } function yyyy(o) { const year = o.dt.year; return padZeros(year < 0 ? Math.abs(year) : year, 4); } function yyyyy(o) { const year = o.dt.year; return padZeros(year < 0 ? Math.abs(year) : year, o.len); } function yo(o) { const year = o.dt.year; return formatOrdinal(year < 0 ? Math.abs(year) : year, o.locale); } /** * Local week-numbering year */ function Y(o) { return o.len === 2 ? padZeros(o.dt.year % 100, 2) : padZeros(o.dt.year, o.len); } function YY(o) { return padZeros(o.dt.year % 100, 2); } function YYY(o) { return padZeros(o.dt.year, 3); } function YYYY(o) { return padZeros(o.dt.year, 4); } function YYYYY(o) { return padZeros(o.dt.year, o.len); } function Yo(o) { return formatOrdinal(o.dt.year, o.locale); } /** * ISO week-numbering year */ function R(o) { return o.len === 2 ? padZeros(getISOWeekYearBase(o.dt.year, o.dt.month, o.dt.day) % 100, 2) : padZeros(getISOWeekYearBase(o.dt.year, o.dt.month, o.dt.day), o.len); } function RR(o) { return padZeros(getISOWeekYearBase(o.dt.year, o.dt.month, o.dt.day) % 100, 2); } function RRR(o) { return padZeros(getISOWeekYearBase(o.dt.year, o.dt.month, o.dt.day), 3); } function RRRR(o) { return padZeros(getISOWeekYearBase(o.dt.year, o.dt.month, o.dt.day), 4); } function RRRRR(o) { return padZeros(getISOWeekYearBase(o.dt.year, o.dt.month, o.dt.day), o.len); } /** * Extended year */ function u(o) { return String(o.dt.year); } function uu(o) { return padZeros(Math.abs(o.dt.year), 2); } function uuu(o) { return padZeros(Math.abs(o.dt.year), 3); } function uuuu(o) { return padZeros(Math.abs(o.dt.year), 4); } function uuuuu(o) { return padZeros(Math.abs(o.dt.year), o.len); } /** * Quarter (formatting) */ function Q(o) { return String(quarter(o.dt.month)); } function Qo(o) { return formatOrdinal(quarter(o.dt.month), o.locale); } function QQ(o) { return padZeros(quarter(o.dt.month), 2); } function QQQ(o) { return `Q${quarter(o.dt.month)}`; } function QQQQ(o) { return `${formatOrdinal(quarter(o.dt.month), o.locale)} quarter`; } function QQQQQ(o) { return String(quarter(o.dt.month)); } /** * Quarter (stand-alone) */ function q(o) { return String(quarter(o.dt.month)); } function qo(o) { return formatOrdinal(quarter(o.dt.month), o.locale); } function qq(o) { return padZeros(quarter(o.dt.month), 2); } function qqq(o) { return `Q${quarter(o.dt.month)}`; } function qqqq(o) { return `${formatOrdinal(quarter(o.dt.month), o.locale)} quarter`; } function qqqqq(o) { return String(quarter(o.dt.month)); } /** * Month (formatting) */ function M(o) { return String(o.dt.month); } function Mo(o) { return formatOrdinal(o.dt.month, o.locale); } function MM(o) { return padZeros(o.dt.month, 2); } function MMM(o) { return getMonthName(o.locale, "short", o.dt.month); } function MMMM(o) { return getMonthName(o.locale, "long", o.dt.month); } function MMMMM(o) { return getMonthName(o.locale, "narrow", o.dt.month); } /** * Month (stand-alone) */ function L(o) { return String(o.dt.month); } function Lo(o) { return formatOrdinal(o.dt.month, o.locale); } function LL(o) { return padZeros(o.dt.month, 2); } function LLL(o) { return getMonthName(o.locale, "short", o.dt.month); } function LLLL(o) { return getMonthName(o.locale, "long", o.dt.month); } function LLLLL(o) { return getMonthName(o.locale, "narrow", o.dt.month); } /** * Local week of year */ function w(o) { return String(weekBase(o.dt.year, o.dt.month, o.dt.day)); } function wo(o) { return formatOrdinal(weekBase(o.dt.year, o.dt.month, o.dt.day), o.locale); } function ww(o) { return padZeros(weekBase(o.dt.year, o.dt.month, o.dt.day), 2); } /** * ISO week of year */ function I(o) { return String(weekBase(o.dt.year, o.dt.month, o.dt.day)); } function Io(o) { return formatOrdinal(weekBase(o.dt.year, o.dt.month, o.dt.day), o.locale); } function II(o) { return padZeros(weekBase(o.dt.year, o.dt.month, o.dt.day), 2); } /** * Day of month */ function d(o) { return String(o.dt.day); } function do_(o) { // Patch for en-US: 1st, 2nd, 3rd, 4th, ... const n = o.dt.day; if (o.locale === "en-US") { const s = ["th", "st", "nd", "rd"]; const v = n % 100; const index = (((v - 20) % 10) + 10) % 10; return n + (s[index] || s[v] || s[0]); } return formatOrdinal(n, o.locale); } function dd(o) { return padZeros(o.dt.day, 2); } /** * Day of year */ function D(o) { return String(dayOfYearBase(o.dt.year, o.dt.month, o.dt.day)); } function Do(o) { return formatOrdinal(dayOfYearBase(o.dt.year, o.dt.month, o.dt.day), o.locale); } function DD(o) { return padZeros(dayOfYearBase(o.dt.year, o.dt.month, o.dt.day), 2); } function DDD(o) { return padZeros(dayOfYearBase(o.dt.year, o.dt.month, o.dt.day), 3); } function DDDD(o) { return padZeros(dayOfYearBase(o.dt.year, o.dt.month, o.dt.day), o.len); } /** * Day of week (formatting) */ function E(o) { return o.len >= 4 ? weekDayName(o.locale, "long", dayOfWeekBase(o.dt.year, o.dt.month, o.dt.day)) : weekDayName(o.locale, "short", dayOfWeekBase(o.dt.year, o.dt.month, o.dt.day)); } function EE(o) { return E(o); } function EEE(o) { return E(o); } function EEEE(o) { return weekDayName(o.locale, "long", dayOfWeekBase(o.dt.year, o.dt.month, o.dt.day)); } function EEEEE(o) { return weekDayName(o.locale, "narrow", dayOfWeekBase(o.dt.year, o.dt.month, o.dt.day)); } function EEEEEE(o) { return weekDayName(o.locale, "short", dayOfWeekBase(o.dt.year, o.dt.month, o.dt.day)).slice(0, 2); } /** * ISO day of week (formatting) */ function i(o) { return String(dayOfWeekBase(o.dt.year, o.dt.month, o.dt.day)); } function io(o) { return formatOrdinal(dayOfWeekBase(o.dt.year, o.dt.month, o.dt.day), o.locale); } function ii(o) { return padZeros(dayOfWeekBase(o.dt.year, o.dt.month, o.dt.day), 2); } function iii(o) { return weekDayName(o.locale, "short", dayOfWeekBase(o.dt.year, o.dt.month, o.dt.day)); } function iiii(o) { return weekDayName(o.locale, "long", dayOfWeekBase(o.dt.year, o.dt.month, o.dt.day)); } function iiiii(o) { return weekDayName(o.locale, "narrow", dayOfWeekBase(o.dt.year, o.dt.month, o.dt.day)); } function iiiiii(o) { return weekDayName(o.locale, "short", dayOfWeekBase(o.dt.year, o.dt.month, o.dt.day)).slice(0, 2); } /** * Local day of week (formatting) */ function e(o) { return String(dayOfWeekBase(o.dt.year, o.dt.month, o.dt.day)); } function eo(o) { return formatOrdinal(dayOfWeekBase(o.dt.year, o.dt.month, o.dt.day), o.locale); } function ee(o) { return padZeros(dayOfWeekBase(o.dt.year, o.dt.month, o.dt.day), 2); } function eee(o) { return weekDayName(o.locale, "short", dayOfWeekBase(o.dt.year, o.dt.month, o.dt.day)); } function eeee(o) { return weekDayName(o.locale, "long", dayOfWeekBase(o.dt.year, o.dt.month, o.dt.day)); } function eeeee(o) { return weekDayName(o.locale, "narrow", dayOfWeekBase(o.dt.year, o.dt.month, o.dt.day)); } function eeeeee(o) { return weekDayName(o.locale, "short", dayOfWeekBase(o.dt.year, o.dt.month, o.dt.day)).slice(0, 2); } /** * Local day of week (stand-alone) */ function c(o) { return String(dayOfWeekBase(o.dt.year, o.dt.month, o.dt.day)); } function co(o) { return formatOrdinal(dayOfWeekBase(o.dt.year, o.dt.month, o.dt.day), o.locale); } function cc(o) { return padZeros(dayOfWeekBase(o.dt.year, o.dt.month, o.dt.day), 2); } function ccc(o) { return weekDayName(o.locale, "short", dayOfWeekBase(o.dt.year, o.dt.month, o.dt.day)); } function cccc(o) { return weekDayName(o.locale, "long", dayOfWeekBase(o.dt.year, o.dt.month, o.dt.day)); } function ccccc(o) { return weekDayName(o.locale, "narrow", dayOfWeekBase(o.dt.year, o.dt.month, o.dt.day)); } function cccccc(o) { return weekDayName(o.locale, "short", dayOfWeekBase(o.dt.year, o.dt.month, o.dt.day)).slice(0, 2); } function ccccccc(o) { return weekDayName(o.locale, "long", dayOfWeekBase(o.dt.year, o.dt.month, o.dt.day)); } /** * AM, PM */ function a(o) { return getDayPeriod(o.locale, o.dt.hour); } function aa(o) { return getDayPeriod(o.locale, o.dt.hour); } function aaa(o) { return getDayPeriod(o.locale, o.dt.hour).toLowerCase(); } function aaaa(o) { const ampm = getDayPeriod(o.locale, o.dt.hour); return `${ampm[0]}.m.`; } function aaaaa(o) { return getDayPeriod(o.locale, o.dt.hour)[0]; } /** * AM, PM, noon, midnight (not fully localized) */ function b(o) { return o.len >= 4 ? o.dt.hour === 12 ? "noon" : o.dt.hour === 0 ? "midnight" : getDayPeriod(o.locale, o.dt.hour) : getDayPeriod(o.locale, o.dt.hour); } function bb(o) { return b(o); } function bbb(o) { return getDayPeriod(o.locale, o.dt.hour); } function bbbb(o) { return getDayPeriod(o.locale, o.dt.hour); } function bbbbb(o) { return getDayPeriod(o.locale, o.dt.hour); } /** * Flexible day period (not localized) */ function B(o) { return o.dt.hour < 6 ? "at night" : o.dt.hour < 12 ? "in the morning" : o.dt.hour < 18 ? "in the afternoon" : "in the evening"; } function BB(o) { return B(o); } function BBB(o) { return B(o); } function BBBB(o) { return B(o); } function BBBBB(o) { return o.dt.hour < 6 ? "night" : o.dt.hour < 12 ? "morning" : o.dt.hour < 18 ? "afternoon" : "evening"; } /** * Hour [1-12] */ function h(o) { return String(to12Hour(o.dt.hour)); } function ho(o) { return formatOrdinal(to12Hour(o.dt.hour), o.locale); } function hh(o) { return padZeros(to12Hour(o.dt.hour), 2); } /** * Hour [0-23] */ function H(o) { return String(o.dt.hour); } function Ho(o) { return formatOrdinal(o.dt.hour, o.locale); } function HH(o) { return padZeros(o.dt.hour, 2); } /** * Hour [0-11] */ function K(o) { return String(o.dt.hour % 12); } function Ko(o) { return formatOrdinal(o.dt.hour % 12, o.locale); } function KK(o) { return padZeros(o.dt.hour % 12, 2); } /** * Hour [1-24] */ function k(o) { return String(o.dt.hour === 0 ? 24 : o.dt.hour); } function ko(o) { return formatOrdinal(o.dt.hour === 0 ? 24 : o.dt.hour, o.locale); } function kk(o) { return padZeros(o.dt.hour === 0 ? 24 : o.dt.hour, 2); } /** * Minute */ function m(o) { return String(o.dt.minute); } function mo(o) { return formatOrdinal(o.dt.minute, o.locale); } function mm(o) { return padZeros(o.dt.minute, 2); } /** * Second */ function s(o) { return String(o.dt.second); } function so(o) { return formatOrdinal(o.dt.second, o.locale); } function ss(o) { return padZeros(o.dt.second, 2); } /** * Fraction of second */ function S(o) { return String(Math.floor(o.dt.millisecond / 100)); } function SS(o) { return padZeros(Math.floor(o.dt.millisecond / 10), 2); } function SSS(o) { return padZeros(o.dt.millisecond, 3); } function SSSS(o) { return padZeros(o.dt.millisecond, o.len); } /** * Timezone (ISO-8601 w/ Z) */ function X(o) { return formatTimezone(o.dt.timeZoneOffsetMinutes, "X".repeat(o.len)); } function XX(o) { return formatTimezone(o.dt.timeZoneOffsetMinutes, "X".repeat(o.len)); } function XXX(o) { return formatTimezone(o.dt.timeZoneOffsetMinutes, "X".repeat(o.len)); } function XXXX(o) { return formatTimezone(o.dt.timeZoneOffsetMinutes, "X".repeat(o.len)); } function XXXXX(o) { return formatTimezone(o.dt.timeZoneOffsetMinutes, "X".repeat(o.len)); } function x(o) { return formatTimezone(o.dt.timeZoneOffsetMinutes, "x".repeat(o.len)); } function xx(o) { return formatTimezone(o.dt.timeZoneOffsetMinutes, "x".repeat(o.len)); } function xxx(o) { return formatTimezone(o.dt.timeZoneOffsetMinutes, "x".repeat(o.len)); } function xxxx(o) { return formatTimezone(o.dt.timeZoneOffsetMinutes, "x".repeat(o.len)); } function xxxxx(o) { return formatTimezone(o.dt.timeZoneOffsetMinutes, "x".repeat(o.len)); } /** * Timezone (GMT) */ function O(o) { return formatGMT(o.dt.timeZoneOffsetMinutes, o.len >= 4); } function OO(o) { return formatGMT(o.dt.timeZoneOffsetMinutes, o.len >= 4); } function OOO(o) { return formatGMT(o.dt.timeZoneOffsetMinutes, o.len >= 4); } function OOOO(o) { return formatGMT(o.dt.timeZoneOffsetMinutes, true); } /** * Timezone (specific non-location) */ function z(o) { return formatGMT(o.dt.timeZoneOffsetMinutes, o.len >= 4); } function zz(o) { return formatGMT(o.dt.timeZoneOffsetMinutes, o.len >= 4); } function zzz(o) { return formatGMT(o.dt.timeZoneOffsetMinutes, o.len >= 4); } function zzzz(o) { return formatGMT(o.dt.timeZoneOffsetMinutes, true); } /** * Seconds timestamp */ function t(o) { return formatTimestamp(o.dt, false); } function tt(o) { return formatTimestamp(o.dt, false); } /** * Milliseconds timestamp */ function T(o) { return formatTimestamp(o.dt, true); } function TT(o) { return formatTimestamp(o.dt, true); } /** * Long localized date (P, PP, PPP, PPPP) */ function P(o) { // MM/dd/yyyy return `${padZeros(o.dt.month, 2)}/${padZeros(o.dt.day, 2)}/${padZeros(o.dt.year, 4)}`; } function PP(o) { return `${getMonthName(o.locale, "long", o.dt.month)} ${formatOrdinal(o.dt.day, o.locale)}, ${o.dt.year}`; } function PPP(o) { return `${weekDayName(o.locale, "long", dayOfWeekBase(o.dt.year, o.dt.month, o.dt.day))}, ${getMonthName(o.locale, "long", o.dt.month)} ${formatOrdinal(o.dt.day, o.locale)}, ${o.dt.year}`; } function PPPP(o) { return `${weekDayName(o.locale, "long", dayOfWeekBase(o.dt.year, o.dt.month, o.dt.day))}, ${getMonthName(o.locale, "long", o.dt.month)} ${formatOrdinal(o.dt.day, o.locale)}, ${o.dt.year}`; } /** * Long localized time (p, pp, ppp, pppp) */ function p(o) { // h:mm a const hour12 = o.dt.hour % 12 || 12; const ampm = getDayPeriod(o.locale, o.dt.hour); return `${hour12}:${padZeros(o.dt.minute, 2)} ${ampm}`; } function pp(o) { return `${to12Hour(o.dt.hour)}:${padZeros(o.dt.minute, 2)}:${padZeros(o.dt.second, 2)} ${getDayPeriod(o.locale, o.dt.hour)}`; } function ppp(o) { return `${to12Hour(o.dt.hour)}:${padZeros(o.dt.minute, 2)}:${padZeros(o.dt.second, 2)} ${getDayPeriod(o.locale, o.dt.hour)} GMT${o.dt.timeZoneOffsetMinutes <= 0 ? "+" : "-"}${padZeros(Math.abs(Math.floor(o.dt.timeZoneOffsetMinutes / 60)), 2)}`; } function pppp(o) { return `${to12Hour(o.dt.hour)}:${padZeros(o.dt.minute, 2)}:${padZeros(o.dt.second, 2)} ${getDayPeriod(o.locale, o.dt.hour)} GMT${o.dt.timeZoneOffsetMinutes <= 0 ? "+" : "-"}${padZeros(Math.abs(Math.floor(o.dt.timeZoneOffsetMinutes / 60)), 2)}:${padZeros(Math.abs(o.dt.timeZoneOffsetMinutes % 60), 2)}`; } /** * Combination of date and time */ function Pp(o) { return `${P({ dt: { day: o.dt.day, month: o.dt.month, year: o.dt.year } })}, ${p({ dt: { hour: o.dt.hour, minute: o.dt.minute }, locale: o.locale })}`; } function PPpp(o) { return `${PP({ dt: { day: o.dt.day, month: o.dt.month, year: o.dt.year }, locale: o.locale })}, ${pp({ dt: { hour: o.dt.hour, minute: o.dt.minute, second: o.dt.second }, locale: o.locale })}`; } function PPPppp(o) { return `${PPP({ dt: { day: o.dt.day, month: o.dt.month, year: o.dt.year }, locale: o.locale })} at ${ppp({ dt: { hour: o.dt.hour, minute: o.dt.minute, second: o.dt.second, timeZoneOffsetMinutes: o.dt.timeZoneOffsetMinutes }, locale: o.locale })}`; } function PPPPpppp(o) { return `${PPPP({ dt: { day: o.dt.day, month: o.dt.month, year: o.dt.year }, locale: o.locale })} at ${pppp({ dt: { hour: o.dt.hour, minute: o.dt.minute, second: o.dt.second, timeZoneOffsetMinutes: o.dt.timeZoneOffsetMinutes }, locale: o.locale })}`; } export const formatters = { a, aa, aaa, aaaa, aaaaa, B, BB, BBB, BBBB, BBBBB, b, bb, bbb, bbbb, bbbbb, c, cc, ccc, cccc, ccccc, cccccc, ccccccc, co, D, DD, DDD, DDDD, Do, d, dd, do: do_, E, EE, EEE, EEEE, EEEEE, EEEEEE, e, ee, eee, eeee, eeeee, eeeeee, eo, G, GG, GGG, GGGG, GGGGG, H, HH, Ho, h, hh, ho, I, II, Io, i, ii, iii, iiii, iiiii, iiiiii, io, K, KK, Ko, k, kk, ko, L, LL, LLL, LLLL, LLLLL, Lo, M, MM, MMM, MMMM, MMMMM, Mo, m, mm, mo, O, OO, OOO, OOOO, P, PP, PPP, PPPP, PPPPpppp, PPPppp, PPpp, Pp, p, pp, ppp, pppp, Q, Qo, QQ, QQQ, QQQQ, QQQQQ, q, qo, qq, qqq, qqqq, qqqqq, R, RR, RRR, RRRR, RRRRR, S, SS, SSS, SSSS, s, so, ss, T, TT, t, tt, u, uu, uuu, uuuu, uuuuu, w, wo, ww, X, XX, XXX, XXXX, XXXXX, x, xx, xxx, xxxx, xxxxx, Y, Yo, YY, YYY, YYYY, YYYYY, y, yo, yy, yyy, yyyy, yyyyy, z, zz, zzz, zzzz, }; //# sourceMappingURL=formatters.pub.js.map