UNPKG

ream.js

Version:

A comprehensive, functional datetime library for JavaScript/TypeScript with immutable data structures, real IANA timezone database support, DST handling, and a plugin system

493 lines 44.6 kB
/********************************************************************* * REAM-DATETIME v3.0 — Full-blown Day.js/Moment replacement * Includes: IANA time-zones, DST math, calendars, locale, plug-ins * Everything is pure, total, and categorically composable. ********************************************************************/ /* ------------------------------------------------------------------ * * 0. INTERNAL UTILS * ------------------------------------------------------------------ */ export const isLeap = (y) => (y % 4 === 0 && y % 100 !== 0) || y % 400 === 0; export const daysInMonth = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; export const MILLIS = { SECOND: 1000, MINUTE: 60000, HOUR: 3600000, DAY: 86400000, WEEK: 604800000, }; /* Real timezone data using Intl API */ export const getTimezoneInfo = (tzName, instant) => { try { // Validate timezone name using Intl API new Intl.DateTimeFormat('en', { timeZone: tzName }); const date = new Date(instant.epochMs); // Simple and reliable method using Date.prototype.toLocaleString const utcTime = new Date(date.toLocaleString('en-US', { timeZone: 'UTC' })); const localTime = new Date(date.toLocaleString('en-US', { timeZone: tzName })); // Calculate offset in minutes (Local - UTC, negated to match standard convention) const offsetMinutes = -Math.round((utcTime.getTime() - localTime.getTime()) / (1000 * 60)); // Determine if DST is active by comparing with standard time const year = date.getFullYear(); const januaryDate = new Date(year, 0, 1, 12, 0, 0); const julyDate = new Date(year, 6, 1, 12, 0, 0); const getOffsetForDate = (testDate) => { const utcTest = new Date(testDate.toLocaleString('en-US', { timeZone: 'UTC' })); const localTest = new Date(testDate.toLocaleString('en-US', { timeZone: tzName })); return -Math.round((utcTest.getTime() - localTest.getTime()) / (1000 * 60)); }; const janOffset = getOffsetForDate(januaryDate); const julOffset = getOffsetForDate(julyDate); // For northern hemisphere timezones like America/New_York: // - Winter (January) is standard time (more negative offset, e.g., -300 for EST) // - Summer (July) is DST (less negative offset, e.g., -240 for EDT) // Standard time is the more negative offset (smaller value) const standardOffset = Math.min(janOffset, julOffset); const dst = offsetMinutes > standardOffset; // Get timezone abbreviation const abbreviation = new Intl.DateTimeFormat('en', { timeZone: tzName, timeZoneName: 'short', }) .formatToParts(date) .find((part) => part.type === 'timeZoneName')?.value; return { name: tzName, offsetMinutes, dst, abbreviation, }; } catch { // Fallback to UTC for invalid timezone names return { name: 'UTC', offsetMinutes: 0, dst: false, abbreviation: 'UTC', }; } }; /* compute offset for any instant using real TZDB */ export const tzOffset = (tz, i) => { const tzInfo = getTimezoneInfo(tz, i); return tzInfo.offsetMinutes; }; /* Get list of available timezones */ export const getAvailableTimezones = () => { // Common IANA timezone identifiers return Object.freeze([ 'UTC', 'America/New_York', 'America/Chicago', 'America/Denver', 'America/Los_Angeles', 'America/Toronto', 'America/Vancouver', 'America/Mexico_City', 'America/Sao_Paulo', 'America/Argentina/Buenos_Aires', 'Europe/London', 'Europe/Paris', 'Europe/Berlin', 'Europe/Rome', 'Europe/Madrid', 'Europe/Amsterdam', 'Europe/Stockholm', 'Europe/Moscow', 'Asia/Tokyo', 'Asia/Shanghai', 'Asia/Hong_Kong', 'Asia/Singapore', 'Asia/Mumbai', 'Asia/Dubai', 'Asia/Seoul', 'Asia/Bangkok', 'Australia/Sydney', 'Australia/Melbourne', 'Australia/Perth', 'Pacific/Auckland', 'Pacific/Honolulu', 'Africa/Cairo', 'Africa/Johannesburg', 'Africa/Lagos', ]); }; export const zdt = (i, z, p) => ({ instant: i, zone: z, payload: p, }); /* Functor map */ export const zfmap = (f) => (z) => ({ ...z, payload: f(z.payload) }); export const calendars = { gregory: { firstDay: 1, monthNames: Array.from({ length: 12 }, (_, i) => new Date(2020, i).toLocaleString('en', { month: 'long' })), }, iso8601: { firstDay: 1, monthNames: Array.from({ length: 12 }, (_, i) => new Date(2020, i).toLocaleString('en', { month: 'long' })), }, buddhist: { firstDay: 1, monthNames: [ 'Poson', 'Āsāḷha', 'Sāvana', 'Bhādrapada', 'Āśvina', 'Kārttika', 'Mārgaśīrṣa', 'Pauṣa', 'Māgha', 'Phālguna', 'Caitra', 'Vaiśākha', ], }, persian: { firstDay: 1, monthNames: [ 'Farvardin', 'Ordibehesht', 'Khordad', 'Tir', 'Mordad', 'Shahrivar', 'Mehr', 'Aban', 'Azar', 'Dey', 'Bahman', 'Esfand', ], }, }; export const formatToken = (token, pdt, locale) => { const d = new Date(pdt.y, pdt.m - 1, pdt.d, pdt.h, pdt.min, pdt.s, pdt.ms); switch (token) { case 'YYYY': return d.getFullYear().toString(); case 'YY': return d.getFullYear().toString().slice(-2); case 'MMMM': return d.toLocaleString(locale, { month: 'long' }); case 'MMM': return d.toLocaleString(locale, { month: 'short' }); case 'MM': return (d.getMonth() + 1).toString().padStart(2, '0'); case 'M': return (d.getMonth() + 1).toString(); case 'DD': return d.getDate().toString().padStart(2, '0'); case 'D': return d.getDate().toString(); case 'dddd': return d.toLocaleString(locale, { weekday: 'long' }); case 'ddd': return d.toLocaleString(locale, { weekday: 'short' }); case 'HH': return d.getHours().toString().padStart(2, '0'); case 'H': return d.getHours().toString(); case 'hh': return (d.getHours() % 12 || 12).toString().padStart(2, '0'); case 'h': return (d.getHours() % 12 || 12).toString(); case 'mm': return d.getMinutes().toString().padStart(2, '0'); case 'm': return d.getMinutes().toString(); case 'ss': return d.getSeconds().toString().padStart(2, '0'); case 's': return d.getSeconds().toString(); case 'SSS': return d.getMilliseconds().toString().padStart(3, '0'); case 'SS': return Math.floor(d.getMilliseconds() / 10) .toString() .padStart(2, '0'); case 'S': return Math.floor(d.getMilliseconds() / 100).toString(); case 'a': return d.getHours() < 12 ? 'am' : 'pm'; case 'A': return d.getHours() < 12 ? 'AM' : 'PM'; case 'Z': return '+00:00'; // UTC offset placeholder case 'ZZ': return '+0000'; // UTC offset placeholder default: return token; } }; export const format = (pattern, pdt, locale = 'en') => pattern.replace(/(YYYY|YY|MMMM|MMM|MM|M|DD|D|dddd|ddd|HH|H|hh|h|mm|m|ss|s|SSS|SS|S|a|A|Z|ZZ)/g, (t) => formatToken(t, pdt, locale)); /* ------------------------------------------------------------------ * * 6. DURATION ARITHMETIC (monoid) * ------------------------------------------------------------------ */ export const zero = { ms: 0 }; export const add = (d1, d2) => ({ ms: d1.ms + d2.ms, }); export const sub = (d1, d2) => ({ ms: d1.ms - d2.ms, }); export const durations = { milliseconds: (n) => ({ ms: n }), seconds: (n) => ({ ms: n * MILLIS.SECOND }), minutes: (n) => ({ ms: n * MILLIS.MINUTE }), hours: (n) => ({ ms: n * MILLIS.HOUR }), days: (n) => ({ ms: n * MILLIS.DAY }), weeks: (n) => ({ ms: n * MILLIS.WEEK }), }; /* ------------------------------------------------------------------ * * 7. UTILITY FUNCTIONS * ------------------------------------------------------------------ */ export const instant = (epochMs) => Object.freeze({ epochMs }); export const duration = (ms) => Object.freeze({ ms }); export const now = () => instant(Date.now()); export const dateTime = (y, month, d, h, min, s, ms) => ({ y, m: month, d, h, min, s, ms }); export const fromPlain = (pdt) => { const epochMs = Date.UTC(pdt.y, pdt.m - 1, pdt.d, pdt.h, pdt.min, pdt.s, pdt.ms); return instant(epochMs); }; export const toPlain = (i) => { const d = new Date(i.epochMs); return { y: d.getUTCFullYear(), m: d.getUTCMonth() + 1, d: d.getUTCDate(), h: d.getUTCHours(), min: d.getUTCMinutes(), s: d.getUTCSeconds(), ms: d.getUTCMilliseconds(), }; }; export const parseISO = (isoString) => { const d = new Date(isoString); if (isNaN(d.getTime())) { // Return epoch instead of throwing return { y: 1970, m: 1, d: 1, h: 0, min: 0, s: 0, ms: 0, }; } return { y: d.getUTCFullYear(), m: d.getUTCMonth() + 1, d: d.getUTCDate(), h: d.getUTCHours(), min: d.getUTCMinutes(), s: d.getUTCSeconds(), ms: d.getUTCMilliseconds(), }; }; export const addDuration = (dur) => (i) => instant(i.epochMs + dur.ms); /* ------------------------------------------------------------------ * * 8. CALENDAR ARITHMETIC (total, safe) * ------------------------------------------------------------------ */ const mod = (n, m) => ((n % m) + m) % m; export const addYears = (n) => (d) => ({ ...d, y: d.y + n }); export const addMonths = (n) => (d) => { const total = d.m - 1 + n; const y = d.y + Math.floor(total / 12); const m = mod(total, 12) + 1; const dim = daysInMonth[m - 1] + (m === 2 && isLeap(y) ? 1 : 0); return { y, m, d: Math.min(d.d, dim) }; }; export const addDays = (n) => (d) => { const ms = fromPlain(dateTime(d.y, d.m, d.d, 0, 0, 0, 0)).epochMs + n * MILLIS.DAY; return toPlain(instant(ms)); }; export const addHours = (n) => (dt) => { const ms = fromPlain(dt).epochMs + n * MILLIS.HOUR; return toPlain(instant(ms)); }; export const addMinutes = (n) => (dt) => { const ms = fromPlain(dt).epochMs + n * MILLIS.MINUTE; return toPlain(instant(ms)); }; export const addSeconds = (n) => (dt) => { const ms = fromPlain(dt).epochMs + n * MILLIS.SECOND; return toPlain(instant(ms)); }; export const addMilliseconds = (n) => (dt) => { const ms = fromPlain(dt).epochMs + n; return toPlain(instant(ms)); }; /* ------------------------------------------------------------------ * * 9. DAY-OF-WEEK / WEEK-BASED YEAR * ------------------------------------------------------------------ */ export const dayOfWeek = (d) => { const t = new Date(d.y, d.m - 1, d.d).getDay(); return t === 0 ? 7 : t; }; export const startOfWeek = (d, startOn = 1) => { const dow = dayOfWeek(d); const diff = (dow - startOn + 7) % 7; return addDays(-diff)(d); }; /* ------------------------------------------------------------------ * * 10. TIMEZONE SUPPORT * ------------------------------------------------------------------ */ export const UTC = { name: 'UTC', offsetMinutes: 0, dst: false }; export const zone = (name, instant = now()) => { return getTimezoneInfo(name, instant); }; export const withZone = (z) => (dt) => zdt(fromPlain(dt), z, dt); export const withZoneName = (zoneName) => (dt) => { const instant = fromPlain(dt); const tz = zone(zoneName, instant); return zdt(instant, tz, dt); }; export const toUTC = (zdtObj) => zdt(instant(zdtObj.instant.epochMs - zdtObj.zone.offsetMinutes * 60000), UTC, zdtObj.payload); export const toZone = (zoneName) => (zdtObj) => { const newZone = zone(zoneName, zdtObj.instant); const adjustedMs = zdtObj.instant.epochMs + (newZone.offsetMinutes - zdtObj.zone.offsetMinutes) * 60000; return zdt(instant(adjustedMs), newZone, zdtObj.payload); }; export const offset = (zdtObj) => duration(zdtObj.zone.offsetMinutes * 60000); /* Timezone utility functions */ export const isValidTimezone = (tzName) => { try { new Intl.DateTimeFormat('en', { timeZone: tzName }); return true; } catch { return false; } }; export const getTimezoneOffset = (tzName, instant = now()) => { return tzOffset(tzName, instant); }; export const isDST = (tzName, instant = now()) => { const tzInfo = getTimezoneInfo(tzName, instant); return tzInfo.dst; }; export const interval = (s, e) => ({ start: s, end: e, }); export const durationOfInterval = (iv) => duration(iv.end.instant.epochMs - iv.start.instant.epochMs); export const every = (dur) => function* (origin) { const generateNext = (cur) => { return (function* () { yield { ...origin, instant: instant(cur) }; yield* generateNext(cur + dur.ms); })(); }; yield* generateNext(origin.instant.epochMs); }; export const everyDay = every(durations.days(1)); export const everyWeek = every(durations.weeks(1)); export const everyMonth = (n = 1) => function* (origin) { const generateNext = (p) => { return (function* () { yield { ...origin, payload: p }; const newDate = addMonths(n)(p); const newDateTime = { ...newDate, h: p.h, min: p.min, s: p.s, ms: p.ms, }; yield* generateNext(newDateTime); })(); }; yield* generateNext(origin.payload); }; /* ------------------------------------------------------------------ * * 13. DURATION HUMANIZATION * ------------------------------------------------------------------ */ export const humanize = (d) => { const abs = Math.abs(d.ms); const sign = d.ms < 0 ? '-' : ''; if (abs < 1000) return `${sign}${abs} ms`; if (abs < 60000) return `${sign}${Math.round(abs / 1000)} s`; if (abs < 3600000) return `${sign}${Math.round(abs / 60000)} min`; if (abs < 86400000) return `${sign}${Math.round(abs / 3600000)} h`; return `${sign}${Math.round(abs / 86400000)} d`; }; export const extend = (plugin) => (rd) => plugin.install(rd); /* ------------------------------------------------------------------ * * 16. FACTORY AND IMPLEMENTATION * ------------------------------------------------------------------ */ /* Factory */ const ream = (input, zoneName = 'UTC') => { const instant = (() => { if (typeof input === 'string') { const parsed = parseISO(input); return fromPlain(parsed); } if (typeof input === 'number') return { epochMs: input }; if (input instanceof Date) return { epochMs: input.getTime() }; if (input) return fromPlain(input); return now(); })(); const timeZone = zoneName === 'UTC' ? UTC : zone(zoneName); return makeReam(instant, timeZone); }; const makeReam = (instant, timeZone) => ({ clone: () => makeReam(instant, timeZone), /* getters */ year: () => toPlain(instant).y, month: () => toPlain(instant).m, date: () => toPlain(instant).d, day: () => dayOfWeek(toPlain(instant)), weekday: () => dayOfWeek(toPlain(instant)), hour: () => toPlain(instant).h, minute: () => toPlain(instant).min, second: () => toPlain(instant).s, millisecond: () => toPlain(instant).ms, /* mutators */ add: (v, unit) => makeReam(addDuration(durations[unit](v))(instant), timeZone), subtract: (v, unit) => makeReam(addDuration(durations[unit](-v))(instant), timeZone), /* formatters */ format: (p = 'YYYY-MM-DDTHH:mm:ss.SSSZ', l = 'en') => format(p, toPlain(instant), l), toISOString: () => { const d = new Date(instant.epochMs); return d.toISOString(); }, toLocaleString: (l = 'en') => format('dddd, MMMM D, YYYY h:mm A', toPlain(instant), l), /* timezone */ tz: (name) => makeReam(instant, zone(name, instant)), utc: () => makeReam(instant, UTC), timezone: () => timeZone, isDST: () => timeZone.dst, offset: () => timeZone.offsetMinutes, valueOf: () => instant.epochMs, }); export default ream; /* ------------------------------------------------------------------ * * 17. EXAMPLE PLUGINS * ------------------------------------------------------------------ */ /* Plugin: relative-time */ const relative = (rd) => ({ fromNow: () => humanize(duration(Date.now() - rd.valueOf())), }); export const relativePlugin = { install: (rd) => ({ ...rd, ...relative(rd) }), }; /* Plugin: business days */ const business = (rd) => ({ nextBusinessDay: () => rd.day() === 6 || rd.day() === 0 ? rd.add(1, 'days') : rd, }); export const businessPlugin = { install: (rd) => ({ ...rd, ...business(rd) }), }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVhbS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvcmVhbS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7OztzRUFJc0U7QUFFdEU7O3dFQUV3RTtBQUN4RSxNQUFNLENBQUMsTUFBTSxNQUFNLEdBQUcsQ0FBQyxDQUFTLEVBQVcsRUFBRSxDQUMzQyxDQUFDLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxHQUFHLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsS0FBSyxDQUFDLENBQUM7QUFDbEQsTUFBTSxDQUFDLE1BQU0sV0FBVyxHQUFHLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztBQUM1RSxNQUFNLENBQUMsTUFBTSxNQUFNLEdBQUc7SUFDcEIsTUFBTSxFQUFFLElBQUk7SUFDWixNQUFNLEVBQUUsS0FBTTtJQUNkLElBQUksRUFBRSxPQUFTO0lBQ2YsR0FBRyxFQUFFLFFBQVU7SUFDZixJQUFJLEVBQUUsU0FBVztDQUNsQixDQUFDO0FBOEJGLHVDQUF1QztBQUN2QyxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsQ0FBQyxNQUFjLEVBQUUsT0FBZ0IsRUFBWSxFQUFFO0lBQzVFLElBQUk7UUFDRix3Q0FBd0M7UUFDeEMsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO1FBRXBELE1BQU0sSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUV2QyxpRUFBaUU7UUFDakUsTUFBTSxPQUFPLEdBQUcsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FB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