UNPKG

chronoshift

Version:

A tiny library for shifting time with timezones

276 lines (275 loc) 8.25 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.shifters = exports.year = exports.month = exports.week = exports.day = exports.hour = exports.minute = exports.second = void 0; exports.getMultiDayShifter = getMultiDayShifter; const date_1 = require("@internationalized/date"); function adjustDay(day) { return (day + 6) % 7; } function floorTo(n, roundTo) { return Math.floor(n / roundTo) * roundTo; } function timeShifterFiller(tm) { const { floor, shift } = tm; return Object.assign(Object.assign({}, tm), { ceil: (dt, tz) => { const floored = floor(dt, tz); if (floored.valueOf() === dt.valueOf()) return dt; return shift(floored, tz, 1); } }); } exports.second = timeShifterFiller({ canonicalLength: 1000, siblings: 60, floor: (dt, _tz) => { dt = new Date(dt.valueOf()); dt.setUTCMilliseconds(0); return dt; }, round: (dt, roundTo, _tz) => { const cur = dt.getUTCSeconds(); const adj = floorTo(cur, roundTo); if (cur !== adj) dt.setUTCSeconds(adj); return dt; }, shift: (dt, _tz, step) => { dt = new Date(dt.valueOf()); dt.setUTCSeconds(dt.getUTCSeconds() + step); return dt; }, }); exports.minute = timeShifterFiller({ canonicalLength: 60000, siblings: 60, floor: (dt, _tz) => { dt = new Date(dt.valueOf()); dt.setUTCSeconds(0, 0); return dt; }, round: (dt, roundTo, _tz) => { const cur = dt.getUTCMinutes(); const adj = floorTo(cur, roundTo); if (cur !== adj) dt.setUTCMinutes(adj); return dt; }, shift: (dt, _tz, step) => { dt = new Date(dt.valueOf()); dt.setUTCMinutes(dt.getUTCMinutes() + step); return dt; }, }); function hourMove(dt, _tz, step) { dt = new Date(dt.valueOf()); dt.setUTCHours(dt.getUTCHours() + step); return dt; } exports.hour = timeShifterFiller({ canonicalLength: 3600000, siblings: 24, floor: (dt, tz) => { if (tz.isUTC()) { dt = new Date(dt.valueOf()); dt.setUTCMinutes(0, 0, 0); return dt; } else { return (0, date_1.fromDate)(dt, tz.toString()).set({ second: 0, minute: 0, millisecond: 0 }).toDate(); } }, shift: hourMove, round: (dt, roundTo, tz) => { if (tz.isUTC()) { const cur = dt.getUTCHours(); const adj = floorTo(cur, roundTo); if (cur !== adj) dt.setUTCHours(adj); } else { const cur = (0, date_1.fromDate)(dt, tz.toString()).hour; const adj = floorTo(cur, roundTo); if (cur !== adj) return hourMove(dt, tz, adj - cur); } return dt; }, }); exports.day = timeShifterFiller({ canonicalLength: 24 * 3600000, siblings: 30, floor: (dt, tz) => { if (tz.isUTC()) { dt = new Date(dt.valueOf()); dt.setUTCHours(0, 0, 0, 0); return dt; } else { return (0, date_1.fromDate)(dt, tz.toString()) .set({ hour: 0, second: 0, minute: 0, millisecond: 0 }) .toDate(); } }, shift: (dt, tz, step) => { if (tz.isUTC()) { dt = new Date(dt.valueOf()); dt.setUTCDate(dt.getUTCDate() + step); return dt; } else { return (0, date_1.fromDate)(dt, tz.toString()).add({ days: step }).toDate(); } }, round: (dt, roundTo, tz) => { if (tz.isUTC()) { const cur = dt.getUTCDate() - 1; const adj = floorTo(cur, roundTo); if (cur !== adj) dt.setUTCDate(adj + 1); } else { const cur = (0, date_1.fromDate)(dt, tz.toString()).day - 1; const adj = floorTo(cur, roundTo); if (cur !== adj) return (0, date_1.fromDate)(dt, tz.toString()) .set({ day: adj + 1 }) .toDate(); } return dt; }, }); exports.week = timeShifterFiller({ canonicalLength: 7 * 24 * 3600000, siblings: 52, floor: (dt, tz) => { if (tz.isUTC()) { dt = new Date(dt.valueOf()); dt.setUTCHours(0, 0, 0, 0); dt.setUTCDate(dt.getUTCDate() - adjustDay(dt.getUTCDay())); } else { const zd = (0, date_1.fromDate)(dt, tz.toString()); return (0, date_1.startOfWeek)(zd.set({ hour: 0, second: 0, minute: 0, millisecond: 0 }), 'fr-FR').toDate(); } return dt; }, shift: (dt, tz, step) => { if (tz.isUTC()) { dt = new Date(dt.valueOf()); dt.setUTCDate(dt.getUTCDate() + step * 7); return dt; } else { return (0, date_1.fromDate)(dt, tz.toString()).add({ weeks: step }).toDate(); } }, round: () => { throw new Error('missing week round'); }, }); function monthShift(dt, tz, step) { if (tz.isUTC()) { dt = new Date(dt.valueOf()); dt.setUTCMonth(dt.getUTCMonth() + step); return dt; } else { return (0, date_1.fromDate)(dt, tz.toString()).add({ months: step }).toDate(); } } exports.month = timeShifterFiller({ canonicalLength: 30 * 24 * 3600000, siblings: 12, floor: (dt, tz) => { if (tz.isUTC()) { dt = new Date(dt.valueOf()); dt.setUTCHours(0, 0, 0, 0); dt.setUTCDate(1); return dt; } else { return (0, date_1.fromDate)(dt, tz.toString()) .set({ day: 1, hour: 0, second: 0, minute: 0, millisecond: 0 }) .toDate(); } }, round: (dt, roundTo, tz) => { if (tz.isUTC()) { const cur = dt.getUTCMonth(); const adj = floorTo(cur, roundTo); if (cur !== adj) dt.setUTCMonth(adj); } else { const cur = (0, date_1.fromDate)(dt, tz.toString()).month - 1; const adj = floorTo(cur, roundTo); if (cur !== adj) return monthShift(dt, tz, adj - cur); } return dt; }, shift: monthShift, }); function yearShift(dt, tz, step) { if (tz.isUTC()) { dt = new Date(dt.valueOf()); dt.setUTCFullYear(dt.getUTCFullYear() + step); return dt; } else { return (0, date_1.fromDate)(dt, tz.toString()).add({ years: step }).toDate(); } } exports.year = timeShifterFiller({ canonicalLength: 365 * 24 * 3600000, siblings: 1000, floor: (dt, tz) => { if (tz.isUTC()) { dt = new Date(dt.valueOf()); dt.setUTCHours(0, 0, 0, 0); dt.setUTCMonth(0, 1); return dt; } else { return (0, date_1.fromDate)(dt, tz.toString()) .set({ month: 1, day: 1, hour: 0, second: 0, minute: 0, millisecond: 0 }) .toDate(); } }, round: (dt, roundTo, tz) => { if (tz.isUTC()) { const cur = dt.getUTCFullYear(); const adj = floorTo(cur, roundTo); if (cur !== adj) dt.setUTCFullYear(adj); } else { const cur = (0, date_1.fromDate)(dt, tz.toString()).year; const adj = floorTo(cur, roundTo); if (cur !== adj) return yearShift(dt, tz, adj - cur); } return dt; }, shift: yearShift, }); function getMultiDayShifter(numDays) { return timeShifterFiller({ canonicalLength: 24 * 3600000 * numDays, siblings: 1, floor: exports.day.floor, shift: (dt, tz, step) => exports.day.shift(dt, tz, step * numDays), round: () => { throw new Error('missing day round'); }, }); } exports.shifters = { second: exports.second, minute: exports.minute, hour: exports.hour, day: exports.day, week: exports.week, month: exports.month, year: exports.year, };