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
JavaScript
/*********************************************************************
* 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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