UNPKG

@technobuddha/library

Version:
242 lines 18.9 kB
import { secondsPerHour, secondsPerMinute } from "./date.js"; import { dayOfWeek } from "./day-of-week.js"; import { dayOfYear } from "./day-of-year.js"; import { isoWeekOfYear } from "./iso-week-of-year.js"; import { julian } from "./julian.js"; import { ordinal } from "./ordinal.js"; import { pad } from "./pad.js"; import { timezone } from "./timezone.js"; import { empty } from "./unicode.js"; const tokenizer = /[hHmDfO]{1,2}|[s]{1,3}|YYYY|YY|[Md]{1,4}|W(y|w{1,2}|d)|TZ|GMT|TH|T{1,2}|AM|PM|CE|BCE|AD|BC|E{2,3}|J|Q|"[^"]*"|'[^']*'/gu; const masks = Object.freeze({ default: 'YYYY-MM-DD hh:mm:ss.ff', rfc1123: 'ddd, DD MMM YYYY hh:mm:ss GMT', asctime: 'ddd MMM DD hh:mm:ss', shortDate: 'M/D/YY', mediumDate: 'MMM D, YYYY', longDate: 'MMMM D, YYYY', fullDate: 'dddd, MMMM D, YYYY', shortTime: 'H:mm TT', shortDateTime: 'M/D/YYYY H:mm TT', mediumTime: 'H:mm:ss TT', mediumDateTime: 'MMM D, YYYY H:mm:ss TT', longTime: 'H:mm:ss TT GMT', longDateTime: 'MMMM D, YYYY H:mm:ss TT GMT', isoDate: 'YYYY-MM-DD', isoDateTime: 'YYYY-MM-DD"T"hh:mm:ss', isoDateFull: 'YYYY-MM-DD"T"hh:mm:ss.ff', isoDateTimeZone: 'YYYY-MM-DD"T"hh:mm:ssTZ', isoDateFullZone: 'YYYY-MM-DD"T"hh:mm:ss.ffTZ', isoTime: 'hh:mm:ss', isoTimeFull: 'hh:mm:ss.ff', isoTimeZone: 'hh:mm:ssTZ', isoFullZone: 'hh:mm:ss.ffTZ', isoWeek: 'Wy"W"Www-Wd', isoWeekTime: 'Wy"W"Www-Wd"T"hh:mm:ss', isoWeekFull: 'Wy"W"Www-Wd"T"hh:mm:ss.ff', isoWeekTimeZone: 'Wy"W"Www-Wd"T"hh:mm:ssTZ', isoWeekFullZone: 'Wy"W"Www-Wd"T"hh:mm:ss.ffTZ', isoOrdinal: 'YYYY-OO', // cspell:ignore hhmmssff timestamp: 'YYYYMMDDhhmmssff', cookie: 'dddd, DD MMM YYYY hh:mm:ss GMT', }); const dayOne = ['U', 'M', 'T', 'W', 'R', 'F', 'S']; const dayTwo = ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa']; const dayAbbrev = ['Sun', 'Mon', 'Tue', 'Wed', 'Thr', 'Fri', 'Sat']; const dayName = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday']; const monthAbbrev = [ 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec', ]; const monthName = [ 'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December', ]; /** * Format a date * @param input - The date * @param mask - The mask * @param options - see {@link FormatDateOptions} * @defaultValue utc false * @group Time * @category Formatting */ export function formatDate(input, mask, { utc = false } = {}) { const argMask = mask ? mask in masks ? masks[mask] : mask : masks.default; const da = utc ? input.getUTCDate() : input.getDate(); const dy = utc ? input.getUTCDay() : input.getDay(); const mo = utc ? input.getUTCMonth() : input.getMonth(); const yr = utc ? input.getUTCFullYear() : input.getFullYear(); const ho = utc ? input.getUTCHours() : input.getHours(); const mi = utc ? input.getUTCMinutes() : input.getMinutes(); const se = utc ? input.getUTCSeconds() : input.getSeconds(); const ms = utc ? input.getUTCMilliseconds() : input.getMilliseconds(); const o = utc ? 0 : input.getTimezoneOffset(); return argMask.replaceAll(tokenizer, (token) => { switch (token) { case 'h': { return pad(ho, 0); } //Hours (24) case 'hh': { return pad(ho, 2); } //Hours (24) case 'H': { return pad(ho % 12 || 12, 0); } //Hours (12) case 'HH': { return pad(ho % 12 || 12, 2); } //Hours (12) case 'm': { return pad(mi, 0); } //Minutes case 'mm': { return pad(mi, 2); } //Minutes case 's': { return pad(se, 0); } //Seconds case 'ss': { return pad(se, 2); } //Seconds case 'sss': { return pad(ho * secondsPerHour + mi * secondsPerMinute + se, 0); } //Seconds case 'f': { return pad(ms, 0); } //Milliseconds case 'ff': { return pad(ms, 3); } //Milliseconds case 'YYYY': { return pad(yr < 1 ? -yr + 1 : yr, 4); } //Year case 'YY': { return pad((yr < 1 ? -yr + 1 : yr) % 100, 2); } //Year case 'M': { return pad(mo + 1, 0); } //Month case 'MM': { return pad(mo + 1, 2); } //Month case 'MMM': { return monthAbbrev[mo]; } //Month case 'MMMM': { return monthName[mo]; } //Month case 'D': { return pad(da, 0); } //Day case 'DD': { return pad(da, 2); } //Day case 'TH': { return ordinal(da); } case 'd': { return dayOne[dy]; } //WeekDay case 'dd': { return dayTwo[dy]; } case 'ddd': { return dayAbbrev[dy]; } //WeekDay case 'dddd': { return dayName[dy]; } case 'O': { return pad(dayOfYear(input, { utc }), 0); } //Day of Year (1-366) case 'OO': { return pad(dayOfYear(input, { utc }), 3); } //Day of Year (1-366) case 'Wy': { return pad(isoWeekOfYear(input, { utc }).year, 0); } case 'Ww': { return pad(isoWeekOfYear(input, { utc }).week, 0); } //Week of Year (1-53) case 'Www': { return pad(isoWeekOfYear(input, { utc }).week, 2); } // case 'Wd': { return pad(dayOfWeek(input, { utc }), 0); } case 'TZ': { return timezone(o); } case 'GMT': { return timezone(o, { gmt: true }); } case 'AM': { return ho < 12 ? 'AM' : empty; } //AM / -- case 'PM': { return ho < 12 ? empty : 'PM'; } //-- / PM case 'T': { return ho < 12 ? 'A' : 'P'; } //A / P case 'TT': { return ho < 12 ? 'AM' : 'PM'; } //AM / PM case 'AD': { return yr < 1 ? empty : 'AD'; } //-- / AD case 'BC': { return yr < 1 ? 'BC' : empty; } //BC / -- case 'CE': { return yr < 1 ? empty : 'CE'; } //-- / CE case 'BCE': { return yr < 1 ? 'BCE' : empty; } //BCE / -- case 'EE': { return yr < 1 ? 'BC' : 'AD'; } //BC / AD case 'EEE': { return yr < 1 ? 'BCE' : 'CE'; } //BCE / CE case 'J': { return pad(Math.floor(julian(input)), 0); } case 'Q': { return pad(Math.floor((mo + 3) / 3), 0); } //RM: Month in roman numerals (UC); //rm: Month in roman numerals (LC); default: { return token.slice(1, -1); } } }); } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybWF0LWRhdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvZm9ybWF0LWRhdGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGNBQWMsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUM3RCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDN0MsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUN0RCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3JDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDdkMsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUMvQixPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFFckMsTUFBTSxTQUFTLEdBQ2IseUhBQXlILENBQUM7QUFFNUgsTUFBTSxLQUFLLEdBQXFDLE1BQU0sQ0FBQyxNQUFNLENBQUM7SUFDNUQsT0FBTyxFQUFFLHdCQUF3QjtJQUNqQyxPQUFPLEVBQUUsK0JBQStCO0lBQ3hDLE9BQU8sRUFBRSxxQkFBcUI7SUFFOUIsU0FBUyxFQUFFLFFBQVE7SUFDbkIsVUFBVSxFQUFFLGFBQWE7SUFDekIsUUFBUSxFQUFFLGNBQWM7SUFDeEIsUUFBUSxFQUFFLG9CQUFvQjtJQUM5QixTQUFTLEVBQUUsU0FBUztJQUNwQixhQUFhLEVBQUUsa0JBQWtCO0lBQ2pDLFVBQVUsRUFBRSxZQUFZO0lBQ3hCLGNBQWMsRUFBRSx3QkFBd0I7SUFDeEMsUUFBUSxFQUFFLGdCQUFnQjtJQUMxQixZQUFZLEVBQUUsNkJBQTZCO0lBQzNDLE9BQU8sRUFBRSxZQUFZO0lBQ3JCLFdBQVcsRUFBRSx1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