@digitalwalletcorp/utils 0.7.0 → 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/date-util-DrfUsv9b.js +181 -0
- package/lib/{date-util-B-g6dSaM.js.map → date-util-DrfUsv9b.js.map} +1 -1
- package/lib/{date-util-DG-ujlhH.cjs → date-util-b1Lw7Nyu.cjs} +2 -2
- package/lib/{date-util-DG-ujlhH.cjs.map → date-util-b1Lw7Nyu.cjs.map} +1 -1
- package/lib/date-util.cjs +1 -1
- package/lib/date-util.d.cts +10 -0
- package/lib/date-util.d.ts +10 -0
- package/lib/date-util.js +11 -10
- package/lib/index.cjs +1 -1
- package/lib/index.js +2 -2
- package/lib/{object-util-aB6Ydufk.js → object-util-BGqczDbJ.js} +122 -93
- package/lib/object-util-BGqczDbJ.js.map +1 -0
- package/lib/object-util-Cc1SmN-8.cjs +2 -0
- package/lib/object-util-Cc1SmN-8.cjs.map +1 -0
- package/lib/object-util.cjs +1 -1
- package/lib/object-util.d.cts +25 -0
- package/lib/object-util.d.ts +25 -0
- package/lib/object-util.js +13 -12
- package/package.json +1 -1
- package/src/date-util.ts +18 -0
- package/src/object-util.ts +62 -0
- package/lib/date-util-B-g6dSaM.js +0 -175
- package/lib/object-util-BUvM8UTt.cjs +0 -2
- package/lib/object-util-BUvM8UTt.cjs.map +0 -1
- package/lib/object-util-aB6Ydufk.js.map +0 -1
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
import { Duration as S, DateTime as s } from "luxon";
|
|
2
|
+
const l = "UTC", m = "yyyy-MM-dd'T'HH:mm:ss.SSSZZ", E = 25569, A = 1440 * 60 * 1e3, D = 3600 * 1e3, g = /GMT[+-]\d{1,2}(:\d{2})?/g, y = {
|
|
3
|
+
UTC: { standard: "UTC" },
|
|
4
|
+
"Asia/Tokyo": { standard: "JST" },
|
|
5
|
+
"Asia/Seoul": { standard: "KST" },
|
|
6
|
+
"Asia/Shanghai": { standard: "CST" },
|
|
7
|
+
"Asia/Hong_Kong": { standard: "HKT" },
|
|
8
|
+
"Asia/Taipei": { standard: "CST" },
|
|
9
|
+
"Asia/Singapore": { standard: "SGT" },
|
|
10
|
+
"Asia/Manila": { standard: "PHT" },
|
|
11
|
+
"Asia/Bangkok": { standard: "ICT" },
|
|
12
|
+
"Asia/Ho_Chi_Minh": { standard: "ICT" },
|
|
13
|
+
"Asia/Jakarta": { standard: "WIB" },
|
|
14
|
+
"Asia/Kolkata": { standard: "IST" },
|
|
15
|
+
"Asia/Dubai": { standard: "GST" },
|
|
16
|
+
"Australia/Sydney": { standard: "AEST", daylight: "AEDT" },
|
|
17
|
+
"Pacific/Auckland": { standard: "NZST", daylight: "NZDT" },
|
|
18
|
+
"Europe/London": { standard: "GMT", daylight: "BST" },
|
|
19
|
+
"Europe/Paris": { standard: "CET", daylight: "CEST" },
|
|
20
|
+
"Europe/Berlin": { standard: "CET", daylight: "CEST" },
|
|
21
|
+
"Europe/Madrid": { standard: "CET", daylight: "CEST" },
|
|
22
|
+
"Europe/Rome": { standard: "CET", daylight: "CEST" },
|
|
23
|
+
"Europe/Amsterdam": { standard: "CET", daylight: "CEST" },
|
|
24
|
+
"America/New_York": { standard: "EST", daylight: "EDT" },
|
|
25
|
+
"America/Toronto": { standard: "EST", daylight: "EDT" },
|
|
26
|
+
"America/Chicago": { standard: "CST", daylight: "CDT" },
|
|
27
|
+
"America/Denver": { standard: "MST", daylight: "MDT" },
|
|
28
|
+
"America/Phoenix": { standard: "MST" },
|
|
29
|
+
"America/Los_Angeles": { standard: "PST", daylight: "PDT" },
|
|
30
|
+
"America/Vancouver": { standard: "PST", daylight: "PDT" },
|
|
31
|
+
"America/Mexico_City": { standard: "CST" },
|
|
32
|
+
"America/Sao_Paulo": { standard: "BRT" }
|
|
33
|
+
}, f = (t) => {
|
|
34
|
+
if (!t.isValid && t.invalidReason === "unsupported zone")
|
|
35
|
+
throw new RangeError(t.invalidExplanation ?? t.invalidReason);
|
|
36
|
+
}, i = (t, a) => {
|
|
37
|
+
if (t == null || t === "")
|
|
38
|
+
return null;
|
|
39
|
+
const n = a?.inputTimezone ?? l;
|
|
40
|
+
let r = null;
|
|
41
|
+
if (t instanceof Date)
|
|
42
|
+
r = s.fromJSDate(t, { zone: n });
|
|
43
|
+
else if (typeof t == "number")
|
|
44
|
+
r = Number.isFinite(t) ? s.fromMillis(t, { zone: n }) : null;
|
|
45
|
+
else {
|
|
46
|
+
const e = a?.inputFormat ? [a.inputFormat].flat() : [];
|
|
47
|
+
for (const d of e) {
|
|
48
|
+
const o = s.fromFormat(t, d, { zone: n });
|
|
49
|
+
if (f(o), o.isValid) {
|
|
50
|
+
r = o;
|
|
51
|
+
break;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
r == null && (r = s.fromISO(t, { zone: n }));
|
|
55
|
+
}
|
|
56
|
+
return r == null || (f(r), !r.isValid) ? null : (a?.duration && (r = r.plus(a.duration)), a?.startOf && (r = r.startOf(a.startOf)), a?.endOf && (r = r.endOf(a.endOf)), r);
|
|
57
|
+
}, u = (t, a, n, r) => {
|
|
58
|
+
const e = i(t, n), d = i(a, n);
|
|
59
|
+
return !e || !d ? !1 : r(e.valueOf(), d.valueOf());
|
|
60
|
+
};
|
|
61
|
+
function O(t, a) {
|
|
62
|
+
return i(t, a)?.toJSDate() ?? null;
|
|
63
|
+
}
|
|
64
|
+
function T(t, a) {
|
|
65
|
+
if (typeof t == "object" && t !== null && !(t instanceof Date))
|
|
66
|
+
return T(/* @__PURE__ */ new Date(), t);
|
|
67
|
+
if (t == null || t === "")
|
|
68
|
+
return "";
|
|
69
|
+
const n = i(t, a);
|
|
70
|
+
if (!n)
|
|
71
|
+
return a?.invalidText ?? "Invalid Date";
|
|
72
|
+
const r = n.setZone(a?.outputTimezone ?? l);
|
|
73
|
+
return f(r), a?.outputFormat ? r.toFormat(a.outputFormat) : r.toISO();
|
|
74
|
+
}
|
|
75
|
+
function C(t, a) {
|
|
76
|
+
return i(t, a) != null;
|
|
77
|
+
}
|
|
78
|
+
function h(t, a, n) {
|
|
79
|
+
return u(t, a, n, (r, e) => r === e);
|
|
80
|
+
}
|
|
81
|
+
function _(t, a, n) {
|
|
82
|
+
return u(t, a, n, (r, e) => r < e);
|
|
83
|
+
}
|
|
84
|
+
function M(t, a, n) {
|
|
85
|
+
return u(t, a, n, (r, e) => r <= e);
|
|
86
|
+
}
|
|
87
|
+
function I(t, a, n) {
|
|
88
|
+
return u(t, a, n, (r, e) => e < r);
|
|
89
|
+
}
|
|
90
|
+
function b(t, a, n) {
|
|
91
|
+
return u(t, a, n, (r, e) => e <= r);
|
|
92
|
+
}
|
|
93
|
+
function p(t, a) {
|
|
94
|
+
const n = i(t, a)?.startOf("day");
|
|
95
|
+
if (!n)
|
|
96
|
+
return !1;
|
|
97
|
+
const r = s.now().setZone(a?.inputTimezone ?? l).startOf("day");
|
|
98
|
+
return n.valueOf() < r.valueOf();
|
|
99
|
+
}
|
|
100
|
+
function P(t, a) {
|
|
101
|
+
const n = i(t, a);
|
|
102
|
+
return n != null && n.valueOf() < Date.now();
|
|
103
|
+
}
|
|
104
|
+
function F(t, a, n, r) {
|
|
105
|
+
const e = i(t, r), d = i(a, r);
|
|
106
|
+
if (!e || !d)
|
|
107
|
+
return NaN;
|
|
108
|
+
const o = n.slice(0, -1);
|
|
109
|
+
return e.startOf(o).diff(d.startOf(o), n).get(n);
|
|
110
|
+
}
|
|
111
|
+
function Z(t = l) {
|
|
112
|
+
const a = s.now().setZone(t);
|
|
113
|
+
return f(a), a.toFormat(m);
|
|
114
|
+
}
|
|
115
|
+
function N(t, a) {
|
|
116
|
+
let n = (t - E) * A;
|
|
117
|
+
return a?.offset && (n -= a.offset * D), n;
|
|
118
|
+
}
|
|
119
|
+
function R(t, a, n) {
|
|
120
|
+
return S.fromObject({ [a]: t }).as(n);
|
|
121
|
+
}
|
|
122
|
+
function L(t, a) {
|
|
123
|
+
const n = a === void 0 ? s.now().setZone(t) : i(a)?.setZone(t);
|
|
124
|
+
return n == null ? !1 : (f(n), n.isInDST);
|
|
125
|
+
}
|
|
126
|
+
function c(t, a) {
|
|
127
|
+
const n = { ...y, ...a?.abbreviations }[t];
|
|
128
|
+
if (!n)
|
|
129
|
+
return null;
|
|
130
|
+
if (n.daylight) {
|
|
131
|
+
const r = s.fromJSDate(a?.at ?? /* @__PURE__ */ new Date(), { zone: t });
|
|
132
|
+
if (f(r), r.isInDST)
|
|
133
|
+
return n.daylight;
|
|
134
|
+
}
|
|
135
|
+
return n.standard;
|
|
136
|
+
}
|
|
137
|
+
function U(t, a, n) {
|
|
138
|
+
const r = c(a, n);
|
|
139
|
+
return r == null ? t : t.replace(g, r);
|
|
140
|
+
}
|
|
141
|
+
const w = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
|
|
142
|
+
__proto__: null,
|
|
143
|
+
applyTimezoneAbbr: U,
|
|
144
|
+
convertExcelDateSerialToUnixTimeSerial: N,
|
|
145
|
+
convertTimeUnit: R,
|
|
146
|
+
currentTimestamp: Z,
|
|
147
|
+
diff: F,
|
|
148
|
+
formatDate: T,
|
|
149
|
+
getTimezoneAbbr: c,
|
|
150
|
+
isAfter: I,
|
|
151
|
+
isBefore: _,
|
|
152
|
+
isInDST: L,
|
|
153
|
+
isPastDate: p,
|
|
154
|
+
isPastDateTime: P,
|
|
155
|
+
isSame: h,
|
|
156
|
+
isSameOrAfter: b,
|
|
157
|
+
isSameOrBefore: M,
|
|
158
|
+
isValid: C,
|
|
159
|
+
parseDate: O
|
|
160
|
+
}, Symbol.toStringTag, { value: "Module" }));
|
|
161
|
+
export {
|
|
162
|
+
U as a,
|
|
163
|
+
R as b,
|
|
164
|
+
N as c,
|
|
165
|
+
w as d,
|
|
166
|
+
Z as e,
|
|
167
|
+
F as f,
|
|
168
|
+
T as g,
|
|
169
|
+
c as h,
|
|
170
|
+
I as i,
|
|
171
|
+
_ as j,
|
|
172
|
+
L as k,
|
|
173
|
+
p as l,
|
|
174
|
+
P as m,
|
|
175
|
+
h as n,
|
|
176
|
+
b as o,
|
|
177
|
+
M as p,
|
|
178
|
+
C as q,
|
|
179
|
+
O as r
|
|
180
|
+
};
|
|
181
|
+
//# sourceMappingURL=date-util-DrfUsv9b.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"date-util-B-g6dSaM.js","sources":["../src/date-util.ts"],"sourcesContent":["import { DateTime, Duration as LuxonDuration } from 'luxon';\nimport type { DateTimeUnit } from 'luxon';\n\n/** 日時として解釈する値。string はISO形式または inputFormat の書式、number は epoch ミリ秒 */\nexport type DateInput = string | Date | number | null | undefined;\n\n/** 日時の切り捨て(startOf / endOf)に使う単位 */\nexport type DateUnit = 'year' | 'quarter' | 'month' | 'week' | 'day' | 'hour' | 'minute' | 'second' | 'millisecond';\n\n/** 期間の単位 */\nexport type TimeUnit = 'milliseconds' | 'seconds' | 'minutes' | 'hours' | 'days' | 'months' | 'years';\n\n/** 日時の加算・減算に使う期間。負の値で減算になる */\nexport interface Duration {\n years?: number;\n quarters?: number;\n months?: number;\n weeks?: number;\n days?: number;\n hours?: number;\n minutes?: number;\n seconds?: number;\n milliseconds?: number;\n}\n\n/**\n * 日時を解釈するときのオプション\n */\nexport interface ParseDateOptions {\n /** 入力の書式。配列の場合は先頭から順に試す。いずれにも一致しない場合はISO形式として解釈する */\n inputFormat?: string | string[];\n /** ゾーン情報を含まない入力をどのタイムゾーンの日時とみなすか(IANA名)。既定は 'UTC' */\n inputTimezone?: string;\n /** 解釈した日時に加算する期間。startOf / endOf より先に適用する */\n duration?: Duration;\n /** 指定した単位の最初の時点に切り捨てる(month なら月初の00:00:00.000) */\n startOf?: DateUnit;\n /** 指定した単位の最後の時点に切り上げる(month なら月末の23:59:59.999) */\n endOf?: DateUnit;\n}\n\n/**\n * 日時を文字列にするときのオプション\n */\nexport interface FormatDateOptions extends ParseDateOptions {\n /** 出力の書式。省略時はISO形式 */\n outputFormat?: string;\n /** 出力に使うタイムゾーン(IANA名)。既定は 'UTC' */\n outputTimezone?: string;\n /** 日時として解釈できない値に対する出力。既定は 'Invalid Date' */\n invalidText?: string;\n}\n\n/** タイムゾーンの略称。夏時間のないタイムゾーンでは daylight を持たない */\nexport interface TimezoneAbbreviation {\n standard: string;\n daylight?: string;\n}\n\n/** IANA名をキーにしたタイムゾーンの略称の表 */\nexport type TimezoneAbbreviations = Record<string, TimezoneAbbreviation>;\n\n/**\n * タイムゾーンの略称を解決するときのオプション\n */\nexport interface TimezoneAbbrOptions {\n /** 夏時間かどうかを判定する時点。既定は現在時刻 */\n at?: Date;\n /** 既定の表に追加・上書きする略称 */\n abbreviations?: TimezoneAbbreviations;\n}\n\nconst DEFAULT_TIMEZONE = 'UTC';\n\nconst TIMESTAMP_FORMAT = `yyyy-MM-dd'T'HH:mm:ss.SSSZZ`;\n\n/** 1970-01-01 を表すExcelの日付シリアル値 */\nconst EXCEL_EPOCH_SERIAL = 25569;\n\nconst MILLISECONDS_PER_DAY = 24 * 60 * 60 * 1000;\n\nconst MILLISECONDS_PER_HOUR = 60 * 60 * 1000;\n\nconst GMT_OFFSET = /GMT[+-]\\d{1,2}(:\\d{2})?/g;\n\n/**\n * 略称の既定の表。略称は世界で一意ではないため(CST は米国中部・中国などで使われる)、このライブラリが採用する表記である\n */\nconst DEFAULT_TIMEZONE_ABBREVIATIONS: TimezoneAbbreviations = {\n 'UTC': { standard: 'UTC' },\n 'Asia/Tokyo': { standard: 'JST' },\n 'Asia/Seoul': { standard: 'KST' },\n 'Asia/Shanghai': { standard: 'CST' },\n 'Asia/Hong_Kong': { standard: 'HKT' },\n 'Asia/Taipei': { standard: 'CST' },\n 'Asia/Singapore': { standard: 'SGT' },\n 'Asia/Manila': { standard: 'PHT' },\n 'Asia/Bangkok': { standard: 'ICT' },\n 'Asia/Ho_Chi_Minh': { standard: 'ICT' },\n 'Asia/Jakarta': { standard: 'WIB' },\n 'Asia/Kolkata': { standard: 'IST' },\n 'Asia/Dubai': { standard: 'GST' },\n 'Australia/Sydney': { standard: 'AEST', daylight: 'AEDT' },\n 'Pacific/Auckland': { standard: 'NZST', daylight: 'NZDT' },\n 'Europe/London': { standard: 'GMT', daylight: 'BST' },\n 'Europe/Paris': { standard: 'CET', daylight: 'CEST' },\n 'Europe/Berlin': { standard: 'CET', daylight: 'CEST' },\n 'Europe/Madrid': { standard: 'CET', daylight: 'CEST' },\n 'Europe/Rome': { standard: 'CET', daylight: 'CEST' },\n 'Europe/Amsterdam': { standard: 'CET', daylight: 'CEST' },\n 'America/New_York': { standard: 'EST', daylight: 'EDT' },\n 'America/Toronto': { standard: 'EST', daylight: 'EDT' },\n 'America/Chicago': { standard: 'CST', daylight: 'CDT' },\n 'America/Denver': { standard: 'MST', daylight: 'MDT' },\n 'America/Phoenix': { standard: 'MST' },\n 'America/Los_Angeles': { standard: 'PST', daylight: 'PDT' },\n 'America/Vancouver': { standard: 'PST', daylight: 'PDT' },\n 'America/Mexico_City': { standard: 'CST' },\n 'America/Sao_Paulo': { standard: 'BRT' }\n};\n\n/**\n * タイムゾーンの指定が不正な場合は、日時の不正とは区別して例外にする\n */\nconst assertZone = (d: DateTime): void => {\n if (!d.isValid && d.invalidReason === 'unsupported zone') {\n throw new RangeError(d.invalidExplanation ?? d.invalidReason);\n }\n};\n\nconst toDateTime = (value: DateInput, options?: ParseDateOptions): DateTime | null => {\n if (value == null || value === '') {\n return null;\n }\n const zone = options?.inputTimezone ?? DEFAULT_TIMEZONE;\n let d: DateTime | null = null;\n if (value instanceof Date) {\n d = DateTime.fromJSDate(value, { zone: zone });\n } else if (typeof value === 'number') {\n d = Number.isFinite(value) ? DateTime.fromMillis(value, { zone: zone }) : null;\n } else {\n const formats = options?.inputFormat ? [options.inputFormat].flat() : [];\n for (const format of formats) {\n const parsed = DateTime.fromFormat(value, format, { zone: zone });\n assertZone(parsed);\n if (parsed.isValid) {\n d = parsed;\n break;\n }\n }\n if (d == null) {\n d = DateTime.fromISO(value, { zone: zone });\n }\n }\n if (d == null) {\n return null;\n }\n assertZone(d);\n if (!d.isValid) {\n return null;\n }\n if (options?.duration) {\n d = d.plus(options.duration);\n }\n if (options?.startOf) {\n d = d.startOf(options.startOf);\n }\n if (options?.endOf) {\n d = d.endOf(options.endOf);\n }\n return d;\n};\n\nconst compare = (date1: DateInput, date2: DateInput, options: ParseDateOptions | undefined, predicate: (v1: number, v2: number) => boolean): boolean => {\n const d1 = toDateTime(date1, options);\n const d2 = toDateTime(date2, options);\n if (!d1 || !d2) {\n return false;\n }\n return predicate(d1.valueOf(), d2.valueOf());\n};\n\n/**\n * 値を日時として解釈し、Date を返す\n * duration / startOf / endOf は inputTimezone のゾーンで計算する\n * 解釈できない値、null / undefined / 空文字は null を返す。タイムゾーンの指定が不正な場合は RangeError をスローする\n *\n * @param {DateInput} value\n * @param {ParseDateOptions} [options]\n * @returns {Date | null}\n */\nexport function parseDate(value: DateInput, options?: ParseDateOptions): Date | null {\n return toDateTime(value, options)?.toJSDate() ?? null;\n}\n\n/**\n * 値を日時として解釈し、outputTimezone での文字列にする\n * value を省略して options だけを渡した場合は現在時刻を整形する\n * null / undefined / 空文字は空文字を返す。解釈できない値は 'Invalid Date' を返す\n * タイムゾーンの指定が不正な場合は RangeError をスローする\n *\n * @param {DateInput} value\n * @param {FormatDateOptions} [options]\n * @returns {string}\n */\nexport function formatDate(options: FormatDateOptions): string;\nexport function formatDate(value: DateInput, options?: FormatDateOptions): string;\nexport function formatDate(value: DateInput | FormatDateOptions, options?: FormatDateOptions): string {\n if (typeof value === 'object' && value !== null && !(value instanceof Date)) {\n return formatDate(new Date(), value);\n }\n if (value == null || value === '') {\n return '';\n }\n const d = toDateTime(value, options);\n if (!d) {\n return options?.invalidText ?? 'Invalid Date';\n }\n const output = d.setZone(options?.outputTimezone ?? DEFAULT_TIMEZONE);\n assertZone(output);\n return options?.outputFormat ? output.toFormat(options.outputFormat) : output.toISO() as string;\n}\n\n/**\n * 値が日時として解釈できるか判定する\n *\n * @param {DateInput} value\n * @param {ParseDateOptions} [options]\n * @returns {boolean}\n */\nexport function isValid(value: DateInput, options?: ParseDateOptions): boolean {\n return toDateTime(value, options) != null;\n}\n\n/**\n * date1 と date2 が同じ時刻か判定する。どちらかが解釈できない場合は false\n *\n * @param {DateInput} date1\n * @param {DateInput} date2\n * @param {ParseDateOptions} [options] 両方の値に適用する\n * @returns {boolean}\n */\nexport function isSame(date1: DateInput, date2: DateInput, options?: ParseDateOptions): boolean {\n return compare(date1, date2, options, (v1, v2) => v1 === v2);\n}\n\n/**\n * date1 が date2 より前の時刻か判定する。どちらかが解釈できない場合は false\n *\n * @param {DateInput} date1\n * @param {DateInput} date2\n * @param {ParseDateOptions} [options] 両方の値に適用する\n * @returns {boolean}\n */\nexport function isBefore(date1: DateInput, date2: DateInput, options?: ParseDateOptions): boolean {\n return compare(date1, date2, options, (v1, v2) => v1 < v2);\n}\n\n/**\n * date1 が date2 と同じか、より前の時刻か判定する。どちらかが解釈できない場合は false\n *\n * @param {DateInput} date1\n * @param {DateInput} date2\n * @param {ParseDateOptions} [options] 両方の値に適用する\n * @returns {boolean}\n */\nexport function isSameOrBefore(date1: DateInput, date2: DateInput, options?: ParseDateOptions): boolean {\n return compare(date1, date2, options, (v1, v2) => v1 <= v2);\n}\n\n/**\n * date1 が date2 より後の時刻か判定する。どちらかが解釈できない場合は false\n *\n * @param {DateInput} date1\n * @param {DateInput} date2\n * @param {ParseDateOptions} [options] 両方の値に適用する\n * @returns {boolean}\n */\nexport function isAfter(date1: DateInput, date2: DateInput, options?: ParseDateOptions): boolean {\n return compare(date1, date2, options, (v1, v2) => v2 < v1);\n}\n\n/**\n * date1 が date2 と同じか、より後の時刻か判定する。どちらかが解釈できない場合は false\n *\n * @param {DateInput} date1\n * @param {DateInput} date2\n * @param {ParseDateOptions} [options] 両方の値に適用する\n * @returns {boolean}\n */\nexport function isSameOrAfter(date1: DateInput, date2: DateInput, options?: ParseDateOptions): boolean {\n return compare(date1, date2, options, (v1, v2) => v2 <= v1);\n}\n\n/**\n * 値が inputTimezone での今日より前の日付か判定する。解釈できない場合は false\n *\n * @param {DateInput} value\n * @param {ParseDateOptions} [options]\n * @returns {boolean}\n */\nexport function isPastDate(value: DateInput, options?: ParseDateOptions): boolean {\n const target = toDateTime(value, options)?.startOf('day');\n if (!target) {\n return false;\n }\n const today = DateTime.now().setZone(options?.inputTimezone ?? DEFAULT_TIMEZONE).startOf('day');\n return target.valueOf() < today.valueOf();\n}\n\n/**\n * 値が現在時刻より前か判定する。解釈できない場合は false\n *\n * @param {DateInput} value\n * @param {ParseDateOptions} [options]\n * @returns {boolean}\n */\nexport function isPastDateTime(value: DateInput, options?: ParseDateOptions): boolean {\n const target = toDateTime(value, options);\n return target != null && target.valueOf() < Date.now();\n}\n\n/**\n * date1 − date2 を unit の単位で返す\n * 両方を inputTimezone で unit の始まりに切り捨ててから差を取るため、暦の上での差になる(23:00 と翌 01:00 の days は 1)\n * どちらかが解釈できない場合は NaN を返す\n *\n * @param {DateInput} date1\n * @param {DateInput} date2\n * @param {TimeUnit} unit\n * @param {ParseDateOptions} [options] 両方の値に適用する\n * @returns {number}\n */\nexport function diff(date1: DateInput, date2: DateInput, unit: TimeUnit, options?: ParseDateOptions): number {\n const d1 = toDateTime(date1, options);\n const d2 = toDateTime(date2, options);\n if (!d1 || !d2) {\n return NaN;\n }\n // 'days' → 'day' のように切り捨ての単位にする\n const dateUnit = unit.slice(0, -1) as DateTimeUnit;\n return d1.startOf(dateUnit).diff(d2.startOf(dateUnit), unit).get(unit);\n}\n\n/**\n * 現在時刻を timezone での 'yyyy-MM-ddTHH:mm:ss.SSS+HH:mm' 形式の文字列で返す\n *\n * @param {string} [timezone] IANA名。既定は 'UTC'\n * @returns {string}\n */\nexport function currentTimestamp(timezone: string = DEFAULT_TIMEZONE): string {\n const d = DateTime.now().setZone(timezone);\n assertZone(d);\n return d.toFormat(TIMESTAMP_FORMAT);\n}\n\n/**\n * Excelの日付シリアル値を epoch ミリ秒に変換する\n * Excelの日付シリアル値はゾーンの概念を持たないため、そのままではUTCの日時として変換される\n * シリアル値がどのゾーンの日時かが分かっている場合は offset に時間差を指定する\n *\n * @example\n * convertExcelDateSerialToUnixTimeSerial(45200); // 1696118400000 (2023-10-01T00:00:00Z)\n * convertExcelDateSerialToUnixTimeSerial(45200, { offset: 9 }); // 1696086000000 (2023-10-01T00:00:00+09:00)\n *\n * @param {number} excelDateSerial\n * @param {*} [options]\n * └ offset シリアル値のゾーンのUTCからの時間差(時)\n * @returns {number}\n */\nexport function convertExcelDateSerialToUnixTimeSerial(excelDateSerial: number, options?: {\n offset: number;\n}): number {\n let timeserial = (excelDateSerial - EXCEL_EPOCH_SERIAL) * MILLISECONDS_PER_DAY;\n if (options?.offset) {\n timeserial -= options.offset * MILLISECONDS_PER_HOUR;\n }\n return timeserial;\n}\n\n/**\n * 期間の値を別の単位に換算する\n * 月と年は固定長(1か月 = 30日、1年 = 365日)として換算する\n *\n * @example\n * convertTimeUnit(1, 'hours', 'milliseconds'); // 3600000\n *\n * @param {number} value\n * @param {TimeUnit} inputUnit\n * @param {TimeUnit} outputUnit\n * @returns {number}\n */\nexport function convertTimeUnit(value: number, inputUnit: TimeUnit, outputUnit: TimeUnit): number {\n return LuxonDuration.fromObject({ [inputUnit]: value }).as(outputUnit);\n}\n\n/**\n * タイムゾーンの略称を返す。夏時間の期間中は夏時間の略称を返す\n * 既定の表にない場合は null を返す。表は options.abbreviations で追加・上書きできる\n *\n * @param {string} timezone IANA名\n * @param {TimezoneAbbrOptions} [options]\n * @returns {string | null}\n */\nexport function getTimezoneAbbr(timezone: string, options?: TimezoneAbbrOptions): string | null {\n const definition = { ...DEFAULT_TIMEZONE_ABBREVIATIONS, ...options?.abbreviations }[timezone];\n if (!definition) {\n return null;\n }\n if (definition.daylight) {\n const d = DateTime.fromJSDate(options?.at ?? new Date(), { zone: timezone });\n assertZone(d);\n if (d.isInDST) {\n return definition.daylight;\n }\n }\n return definition.standard;\n}\n\n/**\n * 文字列中の 'GMT+9' のようなオフセット表記を、timezone の略称に置き換える\n * 略称が解決できない場合は文字列をそのまま返す\n *\n * @param {string} text\n * @param {string} timezone IANA名\n * @param {TimezoneAbbrOptions} [options]\n * @returns {string}\n */\nexport function applyTimezoneAbbr(text: string, timezone: string, options?: TimezoneAbbrOptions): string {\n const abbr = getTimezoneAbbr(timezone, options);\n return abbr == null ? text : text.replace(GMT_OFFSET, abbr);\n}\n"],"names":["DEFAULT_TIMEZONE","TIMESTAMP_FORMAT","EXCEL_EPOCH_SERIAL","MILLISECONDS_PER_DAY","MILLISECONDS_PER_HOUR","GMT_OFFSET","DEFAULT_TIMEZONE_ABBREVIATIONS","assertZone","d","toDateTime","value","options","zone","DateTime","formats","format","parsed","compare","date1","date2","predicate","d1","d2","parseDate","formatDate","output","isValid","isSame","v1","v2","isBefore","isSameOrBefore","isAfter","isSameOrAfter","isPastDate","target","today","isPastDateTime","diff","unit","dateUnit","currentTimestamp","timezone","convertExcelDateSerialToUnixTimeSerial","excelDateSerial","timeserial","convertTimeUnit","inputUnit","outputUnit","LuxonDuration","getTimezoneAbbr","definition","applyTimezoneAbbr","text","abbr"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"date-util-DrfUsv9b.js","sources":["../src/date-util.ts"],"sourcesContent":["import { DateTime, Duration as LuxonDuration } from 'luxon';\nimport type { DateTimeUnit } from 'luxon';\n\n/** 日時として解釈する値。string はISO形式または inputFormat の書式、number は epoch ミリ秒 */\nexport type DateInput = string | Date | number | null | undefined;\n\n/** 日時の切り捨て(startOf / endOf)に使う単位 */\nexport type DateUnit = 'year' | 'quarter' | 'month' | 'week' | 'day' | 'hour' | 'minute' | 'second' | 'millisecond';\n\n/** 期間の単位 */\nexport type TimeUnit = 'milliseconds' | 'seconds' | 'minutes' | 'hours' | 'days' | 'months' | 'years';\n\n/** 日時の加算・減算に使う期間。負の値で減算になる */\nexport interface Duration {\n years?: number;\n quarters?: number;\n months?: number;\n weeks?: number;\n days?: number;\n hours?: number;\n minutes?: number;\n seconds?: number;\n milliseconds?: number;\n}\n\n/**\n * 日時を解釈するときのオプション\n */\nexport interface ParseDateOptions {\n /** 入力の書式。配列の場合は先頭から順に試す。いずれにも一致しない場合はISO形式として解釈する */\n inputFormat?: string | string[];\n /** ゾーン情報を含まない入力をどのタイムゾーンの日時とみなすか(IANA名)。既定は 'UTC' */\n inputTimezone?: string;\n /** 解釈した日時に加算する期間。startOf / endOf より先に適用する */\n duration?: Duration;\n /** 指定した単位の最初の時点に切り捨てる(month なら月初の00:00:00.000) */\n startOf?: DateUnit;\n /** 指定した単位の最後の時点に切り上げる(month なら月末の23:59:59.999) */\n endOf?: DateUnit;\n}\n\n/**\n * 日時を文字列にするときのオプション\n */\nexport interface FormatDateOptions extends ParseDateOptions {\n /** 出力の書式。省略時はISO形式 */\n outputFormat?: string;\n /** 出力に使うタイムゾーン(IANA名)。既定は 'UTC' */\n outputTimezone?: string;\n /** 日時として解釈できない値に対する出力。既定は 'Invalid Date' */\n invalidText?: string;\n}\n\n/** タイムゾーンの略称。夏時間のないタイムゾーンでは daylight を持たない */\nexport interface TimezoneAbbreviation {\n standard: string;\n daylight?: string;\n}\n\n/** IANA名をキーにしたタイムゾーンの略称の表 */\nexport type TimezoneAbbreviations = Record<string, TimezoneAbbreviation>;\n\n/**\n * タイムゾーンの略称を解決するときのオプション\n */\nexport interface TimezoneAbbrOptions {\n /** 夏時間かどうかを判定する時点。既定は現在時刻 */\n at?: Date;\n /** 既定の表に追加・上書きする略称 */\n abbreviations?: TimezoneAbbreviations;\n}\n\nconst DEFAULT_TIMEZONE = 'UTC';\n\nconst TIMESTAMP_FORMAT = `yyyy-MM-dd'T'HH:mm:ss.SSSZZ`;\n\n/** 1970-01-01 を表すExcelの日付シリアル値 */\nconst EXCEL_EPOCH_SERIAL = 25569;\n\nconst MILLISECONDS_PER_DAY = 24 * 60 * 60 * 1000;\n\nconst MILLISECONDS_PER_HOUR = 60 * 60 * 1000;\n\nconst GMT_OFFSET = /GMT[+-]\\d{1,2}(:\\d{2})?/g;\n\n/**\n * 略称の既定の表。略称は世界で一意ではないため(CST は米国中部・中国などで使われる)、このライブラリが採用する表記である\n */\nconst DEFAULT_TIMEZONE_ABBREVIATIONS: TimezoneAbbreviations = {\n 'UTC': { standard: 'UTC' },\n 'Asia/Tokyo': { standard: 'JST' },\n 'Asia/Seoul': { standard: 'KST' },\n 'Asia/Shanghai': { standard: 'CST' },\n 'Asia/Hong_Kong': { standard: 'HKT' },\n 'Asia/Taipei': { standard: 'CST' },\n 'Asia/Singapore': { standard: 'SGT' },\n 'Asia/Manila': { standard: 'PHT' },\n 'Asia/Bangkok': { standard: 'ICT' },\n 'Asia/Ho_Chi_Minh': { standard: 'ICT' },\n 'Asia/Jakarta': { standard: 'WIB' },\n 'Asia/Kolkata': { standard: 'IST' },\n 'Asia/Dubai': { standard: 'GST' },\n 'Australia/Sydney': { standard: 'AEST', daylight: 'AEDT' },\n 'Pacific/Auckland': { standard: 'NZST', daylight: 'NZDT' },\n 'Europe/London': { standard: 'GMT', daylight: 'BST' },\n 'Europe/Paris': { standard: 'CET', daylight: 'CEST' },\n 'Europe/Berlin': { standard: 'CET', daylight: 'CEST' },\n 'Europe/Madrid': { standard: 'CET', daylight: 'CEST' },\n 'Europe/Rome': { standard: 'CET', daylight: 'CEST' },\n 'Europe/Amsterdam': { standard: 'CET', daylight: 'CEST' },\n 'America/New_York': { standard: 'EST', daylight: 'EDT' },\n 'America/Toronto': { standard: 'EST', daylight: 'EDT' },\n 'America/Chicago': { standard: 'CST', daylight: 'CDT' },\n 'America/Denver': { standard: 'MST', daylight: 'MDT' },\n 'America/Phoenix': { standard: 'MST' },\n 'America/Los_Angeles': { standard: 'PST', daylight: 'PDT' },\n 'America/Vancouver': { standard: 'PST', daylight: 'PDT' },\n 'America/Mexico_City': { standard: 'CST' },\n 'America/Sao_Paulo': { standard: 'BRT' }\n};\n\n/**\n * タイムゾーンの指定が不正な場合は、日時の不正とは区別して例外にする\n */\nconst assertZone = (d: DateTime): void => {\n if (!d.isValid && d.invalidReason === 'unsupported zone') {\n throw new RangeError(d.invalidExplanation ?? d.invalidReason);\n }\n};\n\nconst toDateTime = (value: DateInput, options?: ParseDateOptions): DateTime | null => {\n if (value == null || value === '') {\n return null;\n }\n const zone = options?.inputTimezone ?? DEFAULT_TIMEZONE;\n let d: DateTime | null = null;\n if (value instanceof Date) {\n d = DateTime.fromJSDate(value, { zone: zone });\n } else if (typeof value === 'number') {\n d = Number.isFinite(value) ? DateTime.fromMillis(value, { zone: zone }) : null;\n } else {\n const formats = options?.inputFormat ? [options.inputFormat].flat() : [];\n for (const format of formats) {\n const parsed = DateTime.fromFormat(value, format, { zone: zone });\n assertZone(parsed);\n if (parsed.isValid) {\n d = parsed;\n break;\n }\n }\n if (d == null) {\n d = DateTime.fromISO(value, { zone: zone });\n }\n }\n if (d == null) {\n return null;\n }\n assertZone(d);\n if (!d.isValid) {\n return null;\n }\n if (options?.duration) {\n d = d.plus(options.duration);\n }\n if (options?.startOf) {\n d = d.startOf(options.startOf);\n }\n if (options?.endOf) {\n d = d.endOf(options.endOf);\n }\n return d;\n};\n\nconst compare = (date1: DateInput, date2: DateInput, options: ParseDateOptions | undefined, predicate: (v1: number, v2: number) => boolean): boolean => {\n const d1 = toDateTime(date1, options);\n const d2 = toDateTime(date2, options);\n if (!d1 || !d2) {\n return false;\n }\n return predicate(d1.valueOf(), d2.valueOf());\n};\n\n/**\n * 値を日時として解釈し、Date を返す\n * duration / startOf / endOf は inputTimezone のゾーンで計算する\n * 解釈できない値、null / undefined / 空文字は null を返す。タイムゾーンの指定が不正な場合は RangeError をスローする\n *\n * @param {DateInput} value\n * @param {ParseDateOptions} [options]\n * @returns {Date | null}\n */\nexport function parseDate(value: DateInput, options?: ParseDateOptions): Date | null {\n return toDateTime(value, options)?.toJSDate() ?? null;\n}\n\n/**\n * 値を日時として解釈し、outputTimezone での文字列にする\n * value を省略して options だけを渡した場合は現在時刻を整形する\n * null / undefined / 空文字は空文字を返す。解釈できない値は 'Invalid Date' を返す\n * タイムゾーンの指定が不正な場合は RangeError をスローする\n *\n * @param {DateInput} value\n * @param {FormatDateOptions} [options]\n * @returns {string}\n */\nexport function formatDate(options: FormatDateOptions): string;\nexport function formatDate(value: DateInput, options?: FormatDateOptions): string;\nexport function formatDate(value: DateInput | FormatDateOptions, options?: FormatDateOptions): string {\n if (typeof value === 'object' && value !== null && !(value instanceof Date)) {\n return formatDate(new Date(), value);\n }\n if (value == null || value === '') {\n return '';\n }\n const d = toDateTime(value, options);\n if (!d) {\n return options?.invalidText ?? 'Invalid Date';\n }\n const output = d.setZone(options?.outputTimezone ?? DEFAULT_TIMEZONE);\n assertZone(output);\n return options?.outputFormat ? output.toFormat(options.outputFormat) : output.toISO() as string;\n}\n\n/**\n * 値が日時として解釈できるか判定する\n *\n * @param {DateInput} value\n * @param {ParseDateOptions} [options]\n * @returns {boolean}\n */\nexport function isValid(value: DateInput, options?: ParseDateOptions): boolean {\n return toDateTime(value, options) != null;\n}\n\n/**\n * date1 と date2 が同じ時刻か判定する。どちらかが解釈できない場合は false\n *\n * @param {DateInput} date1\n * @param {DateInput} date2\n * @param {ParseDateOptions} [options] 両方の値に適用する\n * @returns {boolean}\n */\nexport function isSame(date1: DateInput, date2: DateInput, options?: ParseDateOptions): boolean {\n return compare(date1, date2, options, (v1, v2) => v1 === v2);\n}\n\n/**\n * date1 が date2 より前の時刻か判定する。どちらかが解釈できない場合は false\n *\n * @param {DateInput} date1\n * @param {DateInput} date2\n * @param {ParseDateOptions} [options] 両方の値に適用する\n * @returns {boolean}\n */\nexport function isBefore(date1: DateInput, date2: DateInput, options?: ParseDateOptions): boolean {\n return compare(date1, date2, options, (v1, v2) => v1 < v2);\n}\n\n/**\n * date1 が date2 と同じか、より前の時刻か判定する。どちらかが解釈できない場合は false\n *\n * @param {DateInput} date1\n * @param {DateInput} date2\n * @param {ParseDateOptions} [options] 両方の値に適用する\n * @returns {boolean}\n */\nexport function isSameOrBefore(date1: DateInput, date2: DateInput, options?: ParseDateOptions): boolean {\n return compare(date1, date2, options, (v1, v2) => v1 <= v2);\n}\n\n/**\n * date1 が date2 より後の時刻か判定する。どちらかが解釈できない場合は false\n *\n * @param {DateInput} date1\n * @param {DateInput} date2\n * @param {ParseDateOptions} [options] 両方の値に適用する\n * @returns {boolean}\n */\nexport function isAfter(date1: DateInput, date2: DateInput, options?: ParseDateOptions): boolean {\n return compare(date1, date2, options, (v1, v2) => v2 < v1);\n}\n\n/**\n * date1 が date2 と同じか、より後の時刻か判定する。どちらかが解釈できない場合は false\n *\n * @param {DateInput} date1\n * @param {DateInput} date2\n * @param {ParseDateOptions} [options] 両方の値に適用する\n * @returns {boolean}\n */\nexport function isSameOrAfter(date1: DateInput, date2: DateInput, options?: ParseDateOptions): boolean {\n return compare(date1, date2, options, (v1, v2) => v2 <= v1);\n}\n\n/**\n * 値が inputTimezone での今日より前の日付か判定する。解釈できない場合は false\n *\n * @param {DateInput} value\n * @param {ParseDateOptions} [options]\n * @returns {boolean}\n */\nexport function isPastDate(value: DateInput, options?: ParseDateOptions): boolean {\n const target = toDateTime(value, options)?.startOf('day');\n if (!target) {\n return false;\n }\n const today = DateTime.now().setZone(options?.inputTimezone ?? DEFAULT_TIMEZONE).startOf('day');\n return target.valueOf() < today.valueOf();\n}\n\n/**\n * 値が現在時刻より前か判定する。解釈できない場合は false\n *\n * @param {DateInput} value\n * @param {ParseDateOptions} [options]\n * @returns {boolean}\n */\nexport function isPastDateTime(value: DateInput, options?: ParseDateOptions): boolean {\n const target = toDateTime(value, options);\n return target != null && target.valueOf() < Date.now();\n}\n\n/**\n * date1 − date2 を unit の単位で返す\n * 両方を inputTimezone で unit の始まりに切り捨ててから差を取るため、暦の上での差になる(23:00 と翌 01:00 の days は 1)\n * どちらかが解釈できない場合は NaN を返す\n *\n * @param {DateInput} date1\n * @param {DateInput} date2\n * @param {TimeUnit} unit\n * @param {ParseDateOptions} [options] 両方の値に適用する\n * @returns {number}\n */\nexport function diff(date1: DateInput, date2: DateInput, unit: TimeUnit, options?: ParseDateOptions): number {\n const d1 = toDateTime(date1, options);\n const d2 = toDateTime(date2, options);\n if (!d1 || !d2) {\n return NaN;\n }\n // 'days' → 'day' のように切り捨ての単位にする\n const dateUnit = unit.slice(0, -1) as DateTimeUnit;\n return d1.startOf(dateUnit).diff(d2.startOf(dateUnit), unit).get(unit);\n}\n\n/**\n * 現在時刻を timezone での 'yyyy-MM-ddTHH:mm:ss.SSS+HH:mm' 形式の文字列で返す\n *\n * @param {string} [timezone] IANA名。既定は 'UTC'\n * @returns {string}\n */\nexport function currentTimestamp(timezone: string = DEFAULT_TIMEZONE): string {\n const d = DateTime.now().setZone(timezone);\n assertZone(d);\n return d.toFormat(TIMESTAMP_FORMAT);\n}\n\n/**\n * Excelの日付シリアル値を epoch ミリ秒に変換する\n * Excelの日付シリアル値はゾーンの概念を持たないため、そのままではUTCの日時として変換される\n * シリアル値がどのゾーンの日時かが分かっている場合は offset に時間差を指定する\n *\n * @example\n * convertExcelDateSerialToUnixTimeSerial(45200); // 1696118400000 (2023-10-01T00:00:00Z)\n * convertExcelDateSerialToUnixTimeSerial(45200, { offset: 9 }); // 1696086000000 (2023-10-01T00:00:00+09:00)\n *\n * @param {number} excelDateSerial\n * @param {*} [options]\n * └ offset シリアル値のゾーンのUTCからの時間差(時)\n * @returns {number}\n */\nexport function convertExcelDateSerialToUnixTimeSerial(excelDateSerial: number, options?: {\n offset: number;\n}): number {\n let timeserial = (excelDateSerial - EXCEL_EPOCH_SERIAL) * MILLISECONDS_PER_DAY;\n if (options?.offset) {\n timeserial -= options.offset * MILLISECONDS_PER_HOUR;\n }\n return timeserial;\n}\n\n/**\n * 期間の値を別の単位に換算する\n * 月と年は固定長(1か月 = 30日、1年 = 365日)として換算する\n *\n * @example\n * convertTimeUnit(1, 'hours', 'milliseconds'); // 3600000\n *\n * @param {number} value\n * @param {TimeUnit} inputUnit\n * @param {TimeUnit} outputUnit\n * @returns {number}\n */\nexport function convertTimeUnit(value: number, inputUnit: TimeUnit, outputUnit: TimeUnit): number {\n return LuxonDuration.fromObject({ [inputUnit]: value }).as(outputUnit);\n}\n\n/**\n * timezone が at の時点で夏時間かどうかを返す\n * at を省略した場合は現在時刻で判定する。at が解釈できない場合は false を返す\n * タイムゾーンの指定が不正な場合は RangeError をスローする\n *\n * @param {string} timezone IANA名\n * @param {DateInput} [at] 判定する時点\n * @returns {boolean}\n */\nexport function isInDST(timezone: string, at?: DateInput): boolean {\n const d = at === undefined ? DateTime.now().setZone(timezone) : toDateTime(at)?.setZone(timezone);\n if (d == null) {\n return false;\n }\n assertZone(d);\n return d.isInDST;\n}\n\n/**\n * タイムゾーンの略称を返す。夏時間の期間中は夏時間の略称を返す\n * 既定の表にない場合は null を返す。表は options.abbreviations で追加・上書きできる\n *\n * @param {string} timezone IANA名\n * @param {TimezoneAbbrOptions} [options]\n * @returns {string | null}\n */\nexport function getTimezoneAbbr(timezone: string, options?: TimezoneAbbrOptions): string | null {\n const definition = { ...DEFAULT_TIMEZONE_ABBREVIATIONS, ...options?.abbreviations }[timezone];\n if (!definition) {\n return null;\n }\n if (definition.daylight) {\n const d = DateTime.fromJSDate(options?.at ?? new Date(), { zone: timezone });\n assertZone(d);\n if (d.isInDST) {\n return definition.daylight;\n }\n }\n return definition.standard;\n}\n\n/**\n * 文字列中の 'GMT+9' のようなオフセット表記を、timezone の略称に置き換える\n * 略称が解決できない場合は文字列をそのまま返す\n *\n * @param {string} text\n * @param {string} timezone IANA名\n * @param {TimezoneAbbrOptions} [options]\n * @returns {string}\n */\nexport function applyTimezoneAbbr(text: string, timezone: string, options?: TimezoneAbbrOptions): string {\n const abbr = getTimezoneAbbr(timezone, options);\n return abbr == null ? text : text.replace(GMT_OFFSET, abbr);\n}\n"],"names":["DEFAULT_TIMEZONE","TIMESTAMP_FORMAT","EXCEL_EPOCH_SERIAL","MILLISECONDS_PER_DAY","MILLISECONDS_PER_HOUR","GMT_OFFSET","DEFAULT_TIMEZONE_ABBREVIATIONS","assertZone","d","toDateTime","value","options","zone","DateTime","formats","format","parsed","compare","date1","date2","predicate","d1","d2","parseDate","formatDate","output","isValid","isSame","v1","v2","isBefore","isSameOrBefore","isAfter","isSameOrAfter","isPastDate","target","today","isPastDateTime","diff","unit","dateUnit","currentTimestamp","timezone","convertExcelDateSerialToUnixTimeSerial","excelDateSerial","timeserial","convertTimeUnit","inputUnit","outputUnit","LuxonDuration","isInDST","at","getTimezoneAbbr","definition","applyTimezoneAbbr","text","abbr"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";const s=require("luxon"),T="UTC",
|
|
2
|
-
//# sourceMappingURL=date-util-
|
|
1
|
+
"use strict";const s=require("luxon"),T="UTC",P="yyyy-MM-dd'T'HH:mm:ss.SSSZZ",F=25569,U=1440*60*1e3,Z=3600*1e3,B=/GMT[+-]\d{1,2}(:\d{2})?/g,N={UTC:{standard:"UTC"},"Asia/Tokyo":{standard:"JST"},"Asia/Seoul":{standard:"KST"},"Asia/Shanghai":{standard:"CST"},"Asia/Hong_Kong":{standard:"HKT"},"Asia/Taipei":{standard:"CST"},"Asia/Singapore":{standard:"SGT"},"Asia/Manila":{standard:"PHT"},"Asia/Bangkok":{standard:"ICT"},"Asia/Ho_Chi_Minh":{standard:"ICT"},"Asia/Jakarta":{standard:"WIB"},"Asia/Kolkata":{standard:"IST"},"Asia/Dubai":{standard:"GST"},"Australia/Sydney":{standard:"AEST",daylight:"AEDT"},"Pacific/Auckland":{standard:"NZST",daylight:"NZDT"},"Europe/London":{standard:"GMT",daylight:"BST"},"Europe/Paris":{standard:"CET",daylight:"CEST"},"Europe/Berlin":{standard:"CET",daylight:"CEST"},"Europe/Madrid":{standard:"CET",daylight:"CEST"},"Europe/Rome":{standard:"CET",daylight:"CEST"},"Europe/Amsterdam":{standard:"CET",daylight:"CEST"},"America/New_York":{standard:"EST",daylight:"EDT"},"America/Toronto":{standard:"EST",daylight:"EDT"},"America/Chicago":{standard:"CST",daylight:"CDT"},"America/Denver":{standard:"MST",daylight:"MDT"},"America/Phoenix":{standard:"MST"},"America/Los_Angeles":{standard:"PST",daylight:"PDT"},"America/Vancouver":{standard:"PST",daylight:"PDT"},"America/Mexico_City":{standard:"CST"},"America/Sao_Paulo":{standard:"BRT"}},f=t=>{if(!t.isValid&&t.invalidReason==="unsupported zone")throw new RangeError(t.invalidExplanation??t.invalidReason)},i=(t,a)=>{if(t==null||t==="")return null;const e=a?.inputTimezone??T;let n=null;if(t instanceof Date)n=s.DateTime.fromJSDate(t,{zone:e});else if(typeof t=="number")n=Number.isFinite(t)?s.DateTime.fromMillis(t,{zone:e}):null;else{const r=a?.inputFormat?[a.inputFormat].flat():[];for(const o of r){const d=s.DateTime.fromFormat(t,o,{zone:e});if(f(d),d.isValid){n=d;break}}n==null&&(n=s.DateTime.fromISO(t,{zone:e}))}return n==null||(f(n),!n.isValid)?null:(a?.duration&&(n=n.plus(a.duration)),a?.startOf&&(n=n.startOf(a.startOf)),a?.endOf&&(n=n.endOf(a.endOf)),n)},u=(t,a,e,n)=>{const r=i(t,e),o=i(a,e);return!r||!o?!1:n(r.valueOf(),o.valueOf())};function m(t,a){return i(t,a)?.toJSDate()??null}function l(t,a){if(typeof t=="object"&&t!==null&&!(t instanceof Date))return l(new Date,t);if(t==null||t==="")return"";const e=i(t,a);if(!e)return a?.invalidText??"Invalid Date";const n=e.setZone(a?.outputTimezone??T);return f(n),a?.outputFormat?n.toFormat(a.outputFormat):n.toISO()}function S(t,a){return i(t,a)!=null}function D(t,a,e){return u(t,a,e,(n,r)=>n===r)}function A(t,a,e){return u(t,a,e,(n,r)=>n<r)}function E(t,a,e){return u(t,a,e,(n,r)=>n<=r)}function y(t,a,e){return u(t,a,e,(n,r)=>r<n)}function O(t,a,e){return u(t,a,e,(n,r)=>r<=n)}function g(t,a){const e=i(t,a)?.startOf("day");if(!e)return!1;const n=s.DateTime.now().setZone(a?.inputTimezone??T).startOf("day");return e.valueOf()<n.valueOf()}function C(t,a){const e=i(t,a);return e!=null&&e.valueOf()<Date.now()}function h(t,a,e,n){const r=i(t,n),o=i(a,n);if(!r||!o)return NaN;const d=e.slice(0,-1);return r.startOf(d).diff(o.startOf(d),e).get(e)}function _(t=T){const a=s.DateTime.now().setZone(t);return f(a),a.toFormat(P)}function b(t,a){let e=(t-F)*U;return a?.offset&&(e-=a.offset*Z),e}function I(t,a,e){return s.Duration.fromObject({[a]:t}).as(e)}function M(t,a){const e=a===void 0?s.DateTime.now().setZone(t):i(a)?.setZone(t);return e==null?!1:(f(e),e.isInDST)}function c(t,a){const e={...N,...a?.abbreviations}[t];if(!e)return null;if(e.daylight){const n=s.DateTime.fromJSDate(a?.at??new Date,{zone:t});if(f(n),n.isInDST)return e.daylight}return e.standard}function p(t,a,e){const n=c(a,e);return n==null?t:t.replace(B,n)}const R=Object.freeze(Object.defineProperty({__proto__:null,applyTimezoneAbbr:p,convertExcelDateSerialToUnixTimeSerial:b,convertTimeUnit:I,currentTimestamp:_,diff:h,formatDate:l,getTimezoneAbbr:c,isAfter:y,isBefore:A,isInDST:M,isPastDate:g,isPastDateTime:C,isSame:D,isSameOrAfter:O,isSameOrBefore:E,isValid:S,parseDate:m},Symbol.toStringTag,{value:"Module"}));exports.applyTimezoneAbbr=p;exports.convertExcelDateSerialToUnixTimeSerial=b;exports.convertTimeUnit=I;exports.currentTimestamp=_;exports.dateUtil=R;exports.diff=h;exports.formatDate=l;exports.getTimezoneAbbr=c;exports.isAfter=y;exports.isBefore=A;exports.isInDST=M;exports.isPastDate=g;exports.isPastDateTime=C;exports.isSame=D;exports.isSameOrAfter=O;exports.isSameOrBefore=E;exports.isValid=S;exports.parseDate=m;
|
|
2
|
+
//# sourceMappingURL=date-util-b1Lw7Nyu.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"date-util-DG-ujlhH.cjs","sources":["../src/date-util.ts"],"sourcesContent":["import { DateTime, Duration as LuxonDuration } from 'luxon';\nimport type { DateTimeUnit } from 'luxon';\n\n/** 日時として解釈する値。string はISO形式または inputFormat の書式、number は epoch ミリ秒 */\nexport type DateInput = string | Date | number | null | undefined;\n\n/** 日時の切り捨て(startOf / endOf)に使う単位 */\nexport type DateUnit = 'year' | 'quarter' | 'month' | 'week' | 'day' | 'hour' | 'minute' | 'second' | 'millisecond';\n\n/** 期間の単位 */\nexport type TimeUnit = 'milliseconds' | 'seconds' | 'minutes' | 'hours' | 'days' | 'months' | 'years';\n\n/** 日時の加算・減算に使う期間。負の値で減算になる */\nexport interface Duration {\n years?: number;\n quarters?: number;\n months?: number;\n weeks?: number;\n days?: number;\n hours?: number;\n minutes?: number;\n seconds?: number;\n milliseconds?: number;\n}\n\n/**\n * 日時を解釈するときのオプション\n */\nexport interface ParseDateOptions {\n /** 入力の書式。配列の場合は先頭から順に試す。いずれにも一致しない場合はISO形式として解釈する */\n inputFormat?: string | string[];\n /** ゾーン情報を含まない入力をどのタイムゾーンの日時とみなすか(IANA名)。既定は 'UTC' */\n inputTimezone?: string;\n /** 解釈した日時に加算する期間。startOf / endOf より先に適用する */\n duration?: Duration;\n /** 指定した単位の最初の時点に切り捨てる(month なら月初の00:00:00.000) */\n startOf?: DateUnit;\n /** 指定した単位の最後の時点に切り上げる(month なら月末の23:59:59.999) */\n endOf?: DateUnit;\n}\n\n/**\n * 日時を文字列にするときのオプション\n */\nexport interface FormatDateOptions extends ParseDateOptions {\n /** 出力の書式。省略時はISO形式 */\n outputFormat?: string;\n /** 出力に使うタイムゾーン(IANA名)。既定は 'UTC' */\n outputTimezone?: string;\n /** 日時として解釈できない値に対する出力。既定は 'Invalid Date' */\n invalidText?: string;\n}\n\n/** タイムゾーンの略称。夏時間のないタイムゾーンでは daylight を持たない */\nexport interface TimezoneAbbreviation {\n standard: string;\n daylight?: string;\n}\n\n/** IANA名をキーにしたタイムゾーンの略称の表 */\nexport type TimezoneAbbreviations = Record<string, TimezoneAbbreviation>;\n\n/**\n * タイムゾーンの略称を解決するときのオプション\n */\nexport interface TimezoneAbbrOptions {\n /** 夏時間かどうかを判定する時点。既定は現在時刻 */\n at?: Date;\n /** 既定の表に追加・上書きする略称 */\n abbreviations?: TimezoneAbbreviations;\n}\n\nconst DEFAULT_TIMEZONE = 'UTC';\n\nconst TIMESTAMP_FORMAT = `yyyy-MM-dd'T'HH:mm:ss.SSSZZ`;\n\n/** 1970-01-01 を表すExcelの日付シリアル値 */\nconst EXCEL_EPOCH_SERIAL = 25569;\n\nconst MILLISECONDS_PER_DAY = 24 * 60 * 60 * 1000;\n\nconst MILLISECONDS_PER_HOUR = 60 * 60 * 1000;\n\nconst GMT_OFFSET = /GMT[+-]\\d{1,2}(:\\d{2})?/g;\n\n/**\n * 略称の既定の表。略称は世界で一意ではないため(CST は米国中部・中国などで使われる)、このライブラリが採用する表記である\n */\nconst DEFAULT_TIMEZONE_ABBREVIATIONS: TimezoneAbbreviations = {\n 'UTC': { standard: 'UTC' },\n 'Asia/Tokyo': { standard: 'JST' },\n 'Asia/Seoul': { standard: 'KST' },\n 'Asia/Shanghai': { standard: 'CST' },\n 'Asia/Hong_Kong': { standard: 'HKT' },\n 'Asia/Taipei': { standard: 'CST' },\n 'Asia/Singapore': { standard: 'SGT' },\n 'Asia/Manila': { standard: 'PHT' },\n 'Asia/Bangkok': { standard: 'ICT' },\n 'Asia/Ho_Chi_Minh': { standard: 'ICT' },\n 'Asia/Jakarta': { standard: 'WIB' },\n 'Asia/Kolkata': { standard: 'IST' },\n 'Asia/Dubai': { standard: 'GST' },\n 'Australia/Sydney': { standard: 'AEST', daylight: 'AEDT' },\n 'Pacific/Auckland': { standard: 'NZST', daylight: 'NZDT' },\n 'Europe/London': { standard: 'GMT', daylight: 'BST' },\n 'Europe/Paris': { standard: 'CET', daylight: 'CEST' },\n 'Europe/Berlin': { standard: 'CET', daylight: 'CEST' },\n 'Europe/Madrid': { standard: 'CET', daylight: 'CEST' },\n 'Europe/Rome': { standard: 'CET', daylight: 'CEST' },\n 'Europe/Amsterdam': { standard: 'CET', daylight: 'CEST' },\n 'America/New_York': { standard: 'EST', daylight: 'EDT' },\n 'America/Toronto': { standard: 'EST', daylight: 'EDT' },\n 'America/Chicago': { standard: 'CST', daylight: 'CDT' },\n 'America/Denver': { standard: 'MST', daylight: 'MDT' },\n 'America/Phoenix': { standard: 'MST' },\n 'America/Los_Angeles': { standard: 'PST', daylight: 'PDT' },\n 'America/Vancouver': { standard: 'PST', daylight: 'PDT' },\n 'America/Mexico_City': { standard: 'CST' },\n 'America/Sao_Paulo': { standard: 'BRT' }\n};\n\n/**\n * タイムゾーンの指定が不正な場合は、日時の不正とは区別して例外にする\n */\nconst assertZone = (d: DateTime): void => {\n if (!d.isValid && d.invalidReason === 'unsupported zone') {\n throw new RangeError(d.invalidExplanation ?? d.invalidReason);\n }\n};\n\nconst toDateTime = (value: DateInput, options?: ParseDateOptions): DateTime | null => {\n if (value == null || value === '') {\n return null;\n }\n const zone = options?.inputTimezone ?? DEFAULT_TIMEZONE;\n let d: DateTime | null = null;\n if (value instanceof Date) {\n d = DateTime.fromJSDate(value, { zone: zone });\n } else if (typeof value === 'number') {\n d = Number.isFinite(value) ? DateTime.fromMillis(value, { zone: zone }) : null;\n } else {\n const formats = options?.inputFormat ? [options.inputFormat].flat() : [];\n for (const format of formats) {\n const parsed = DateTime.fromFormat(value, format, { zone: zone });\n assertZone(parsed);\n if (parsed.isValid) {\n d = parsed;\n break;\n }\n }\n if (d == null) {\n d = DateTime.fromISO(value, { zone: zone });\n }\n }\n if (d == null) {\n return null;\n }\n assertZone(d);\n if (!d.isValid) {\n return null;\n }\n if (options?.duration) {\n d = d.plus(options.duration);\n }\n if (options?.startOf) {\n d = d.startOf(options.startOf);\n }\n if (options?.endOf) {\n d = d.endOf(options.endOf);\n }\n return d;\n};\n\nconst compare = (date1: DateInput, date2: DateInput, options: ParseDateOptions | undefined, predicate: (v1: number, v2: number) => boolean): boolean => {\n const d1 = toDateTime(date1, options);\n const d2 = toDateTime(date2, options);\n if (!d1 || !d2) {\n return false;\n }\n return predicate(d1.valueOf(), d2.valueOf());\n};\n\n/**\n * 値を日時として解釈し、Date を返す\n * duration / startOf / endOf は inputTimezone のゾーンで計算する\n * 解釈できない値、null / undefined / 空文字は null を返す。タイムゾーンの指定が不正な場合は RangeError をスローする\n *\n * @param {DateInput} value\n * @param {ParseDateOptions} [options]\n * @returns {Date | null}\n */\nexport function parseDate(value: DateInput, options?: ParseDateOptions): Date | null {\n return toDateTime(value, options)?.toJSDate() ?? null;\n}\n\n/**\n * 値を日時として解釈し、outputTimezone での文字列にする\n * value を省略して options だけを渡した場合は現在時刻を整形する\n * null / undefined / 空文字は空文字を返す。解釈できない値は 'Invalid Date' を返す\n * タイムゾーンの指定が不正な場合は RangeError をスローする\n *\n * @param {DateInput} value\n * @param {FormatDateOptions} [options]\n * @returns {string}\n */\nexport function formatDate(options: FormatDateOptions): string;\nexport function formatDate(value: DateInput, options?: FormatDateOptions): string;\nexport function formatDate(value: DateInput | FormatDateOptions, options?: FormatDateOptions): string {\n if (typeof value === 'object' && value !== null && !(value instanceof Date)) {\n return formatDate(new Date(), value);\n }\n if (value == null || value === '') {\n return '';\n }\n const d = toDateTime(value, options);\n if (!d) {\n return options?.invalidText ?? 'Invalid Date';\n }\n const output = d.setZone(options?.outputTimezone ?? DEFAULT_TIMEZONE);\n assertZone(output);\n return options?.outputFormat ? output.toFormat(options.outputFormat) : output.toISO() as string;\n}\n\n/**\n * 値が日時として解釈できるか判定する\n *\n * @param {DateInput} value\n * @param {ParseDateOptions} [options]\n * @returns {boolean}\n */\nexport function isValid(value: DateInput, options?: ParseDateOptions): boolean {\n return toDateTime(value, options) != null;\n}\n\n/**\n * date1 と date2 が同じ時刻か判定する。どちらかが解釈できない場合は false\n *\n * @param {DateInput} date1\n * @param {DateInput} date2\n * @param {ParseDateOptions} [options] 両方の値に適用する\n * @returns {boolean}\n */\nexport function isSame(date1: DateInput, date2: DateInput, options?: ParseDateOptions): boolean {\n return compare(date1, date2, options, (v1, v2) => v1 === v2);\n}\n\n/**\n * date1 が date2 より前の時刻か判定する。どちらかが解釈できない場合は false\n *\n * @param {DateInput} date1\n * @param {DateInput} date2\n * @param {ParseDateOptions} [options] 両方の値に適用する\n * @returns {boolean}\n */\nexport function isBefore(date1: DateInput, date2: DateInput, options?: ParseDateOptions): boolean {\n return compare(date1, date2, options, (v1, v2) => v1 < v2);\n}\n\n/**\n * date1 が date2 と同じか、より前の時刻か判定する。どちらかが解釈できない場合は false\n *\n * @param {DateInput} date1\n * @param {DateInput} date2\n * @param {ParseDateOptions} [options] 両方の値に適用する\n * @returns {boolean}\n */\nexport function isSameOrBefore(date1: DateInput, date2: DateInput, options?: ParseDateOptions): boolean {\n return compare(date1, date2, options, (v1, v2) => v1 <= v2);\n}\n\n/**\n * date1 が date2 より後の時刻か判定する。どちらかが解釈できない場合は false\n *\n * @param {DateInput} date1\n * @param {DateInput} date2\n * @param {ParseDateOptions} [options] 両方の値に適用する\n * @returns {boolean}\n */\nexport function isAfter(date1: DateInput, date2: DateInput, options?: ParseDateOptions): boolean {\n return compare(date1, date2, options, (v1, v2) => v2 < v1);\n}\n\n/**\n * date1 が date2 と同じか、より後の時刻か判定する。どちらかが解釈できない場合は false\n *\n * @param {DateInput} date1\n * @param {DateInput} date2\n * @param {ParseDateOptions} [options] 両方の値に適用する\n * @returns {boolean}\n */\nexport function isSameOrAfter(date1: DateInput, date2: DateInput, options?: ParseDateOptions): boolean {\n return compare(date1, date2, options, (v1, v2) => v2 <= v1);\n}\n\n/**\n * 値が inputTimezone での今日より前の日付か判定する。解釈できない場合は false\n *\n * @param {DateInput} value\n * @param {ParseDateOptions} [options]\n * @returns {boolean}\n */\nexport function isPastDate(value: DateInput, options?: ParseDateOptions): boolean {\n const target = toDateTime(value, options)?.startOf('day');\n if (!target) {\n return false;\n }\n const today = DateTime.now().setZone(options?.inputTimezone ?? DEFAULT_TIMEZONE).startOf('day');\n return target.valueOf() < today.valueOf();\n}\n\n/**\n * 値が現在時刻より前か判定する。解釈できない場合は false\n *\n * @param {DateInput} value\n * @param {ParseDateOptions} [options]\n * @returns {boolean}\n */\nexport function isPastDateTime(value: DateInput, options?: ParseDateOptions): boolean {\n const target = toDateTime(value, options);\n return target != null && target.valueOf() < Date.now();\n}\n\n/**\n * date1 − date2 を unit の単位で返す\n * 両方を inputTimezone で unit の始まりに切り捨ててから差を取るため、暦の上での差になる(23:00 と翌 01:00 の days は 1)\n * どちらかが解釈できない場合は NaN を返す\n *\n * @param {DateInput} date1\n * @param {DateInput} date2\n * @param {TimeUnit} unit\n * @param {ParseDateOptions} [options] 両方の値に適用する\n * @returns {number}\n */\nexport function diff(date1: DateInput, date2: DateInput, unit: TimeUnit, options?: ParseDateOptions): number {\n const d1 = toDateTime(date1, options);\n const d2 = toDateTime(date2, options);\n if (!d1 || !d2) {\n return NaN;\n }\n // 'days' → 'day' のように切り捨ての単位にする\n const dateUnit = unit.slice(0, -1) as DateTimeUnit;\n return d1.startOf(dateUnit).diff(d2.startOf(dateUnit), unit).get(unit);\n}\n\n/**\n * 現在時刻を timezone での 'yyyy-MM-ddTHH:mm:ss.SSS+HH:mm' 形式の文字列で返す\n *\n * @param {string} [timezone] IANA名。既定は 'UTC'\n * @returns {string}\n */\nexport function currentTimestamp(timezone: string = DEFAULT_TIMEZONE): string {\n const d = DateTime.now().setZone(timezone);\n assertZone(d);\n return d.toFormat(TIMESTAMP_FORMAT);\n}\n\n/**\n * Excelの日付シリアル値を epoch ミリ秒に変換する\n * Excelの日付シリアル値はゾーンの概念を持たないため、そのままではUTCの日時として変換される\n * シリアル値がどのゾーンの日時かが分かっている場合は offset に時間差を指定する\n *\n * @example\n * convertExcelDateSerialToUnixTimeSerial(45200); // 1696118400000 (2023-10-01T00:00:00Z)\n * convertExcelDateSerialToUnixTimeSerial(45200, { offset: 9 }); // 1696086000000 (2023-10-01T00:00:00+09:00)\n *\n * @param {number} excelDateSerial\n * @param {*} [options]\n * └ offset シリアル値のゾーンのUTCからの時間差(時)\n * @returns {number}\n */\nexport function convertExcelDateSerialToUnixTimeSerial(excelDateSerial: number, options?: {\n offset: number;\n}): number {\n let timeserial = (excelDateSerial - EXCEL_EPOCH_SERIAL) * MILLISECONDS_PER_DAY;\n if (options?.offset) {\n timeserial -= options.offset * MILLISECONDS_PER_HOUR;\n }\n return timeserial;\n}\n\n/**\n * 期間の値を別の単位に換算する\n * 月と年は固定長(1か月 = 30日、1年 = 365日)として換算する\n *\n * @example\n * convertTimeUnit(1, 'hours', 'milliseconds'); // 3600000\n *\n * @param {number} value\n * @param {TimeUnit} inputUnit\n * @param {TimeUnit} outputUnit\n * @returns {number}\n */\nexport function convertTimeUnit(value: number, inputUnit: TimeUnit, outputUnit: TimeUnit): number {\n return LuxonDuration.fromObject({ [inputUnit]: value }).as(outputUnit);\n}\n\n/**\n * タイムゾーンの略称を返す。夏時間の期間中は夏時間の略称を返す\n * 既定の表にない場合は null を返す。表は options.abbreviations で追加・上書きできる\n *\n * @param {string} timezone IANA名\n * @param {TimezoneAbbrOptions} [options]\n * @returns {string | null}\n */\nexport function getTimezoneAbbr(timezone: string, options?: TimezoneAbbrOptions): string | null {\n const definition = { ...DEFAULT_TIMEZONE_ABBREVIATIONS, ...options?.abbreviations }[timezone];\n if (!definition) {\n return null;\n }\n if (definition.daylight) {\n const d = DateTime.fromJSDate(options?.at ?? new Date(), { zone: timezone });\n assertZone(d);\n if (d.isInDST) {\n return definition.daylight;\n }\n }\n return definition.standard;\n}\n\n/**\n * 文字列中の 'GMT+9' のようなオフセット表記を、timezone の略称に置き換える\n * 略称が解決できない場合は文字列をそのまま返す\n *\n * @param {string} text\n * @param {string} timezone IANA名\n * @param {TimezoneAbbrOptions} [options]\n * @returns {string}\n */\nexport function applyTimezoneAbbr(text: string, timezone: string, options?: TimezoneAbbrOptions): string {\n const abbr = getTimezoneAbbr(timezone, options);\n return abbr == null ? text : text.replace(GMT_OFFSET, abbr);\n}\n"],"names":["DEFAULT_TIMEZONE","TIMESTAMP_FORMAT","EXCEL_EPOCH_SERIAL","MILLISECONDS_PER_DAY","MILLISECONDS_PER_HOUR","GMT_OFFSET","DEFAULT_TIMEZONE_ABBREVIATIONS","assertZone","d","toDateTime","value","options","zone","DateTime","formats","format","parsed","compare","date1","date2","predicate","d1","d2","parseDate","formatDate","output","isValid","isSame","v1","v2","isBefore","isSameOrBefore","isAfter","isSameOrAfter","isPastDate","target","today","isPastDateTime","diff","unit","dateUnit","currentTimestamp","timezone","convertExcelDateSerialToUnixTimeSerial","excelDateSerial","timeserial","convertTimeUnit","inputUnit","outputUnit","LuxonDuration","getTimezoneAbbr","definition","applyTimezoneAbbr","text","abbr"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"date-util-b1Lw7Nyu.cjs","sources":["../src/date-util.ts"],"sourcesContent":["import { DateTime, Duration as LuxonDuration } from 'luxon';\nimport type { DateTimeUnit } from 'luxon';\n\n/** 日時として解釈する値。string はISO形式または inputFormat の書式、number は epoch ミリ秒 */\nexport type DateInput = string | Date | number | null | undefined;\n\n/** 日時の切り捨て(startOf / endOf)に使う単位 */\nexport type DateUnit = 'year' | 'quarter' | 'month' | 'week' | 'day' | 'hour' | 'minute' | 'second' | 'millisecond';\n\n/** 期間の単位 */\nexport type TimeUnit = 'milliseconds' | 'seconds' | 'minutes' | 'hours' | 'days' | 'months' | 'years';\n\n/** 日時の加算・減算に使う期間。負の値で減算になる */\nexport interface Duration {\n years?: number;\n quarters?: number;\n months?: number;\n weeks?: number;\n days?: number;\n hours?: number;\n minutes?: number;\n seconds?: number;\n milliseconds?: number;\n}\n\n/**\n * 日時を解釈するときのオプション\n */\nexport interface ParseDateOptions {\n /** 入力の書式。配列の場合は先頭から順に試す。いずれにも一致しない場合はISO形式として解釈する */\n inputFormat?: string | string[];\n /** ゾーン情報を含まない入力をどのタイムゾーンの日時とみなすか(IANA名)。既定は 'UTC' */\n inputTimezone?: string;\n /** 解釈した日時に加算する期間。startOf / endOf より先に適用する */\n duration?: Duration;\n /** 指定した単位の最初の時点に切り捨てる(month なら月初の00:00:00.000) */\n startOf?: DateUnit;\n /** 指定した単位の最後の時点に切り上げる(month なら月末の23:59:59.999) */\n endOf?: DateUnit;\n}\n\n/**\n * 日時を文字列にするときのオプション\n */\nexport interface FormatDateOptions extends ParseDateOptions {\n /** 出力の書式。省略時はISO形式 */\n outputFormat?: string;\n /** 出力に使うタイムゾーン(IANA名)。既定は 'UTC' */\n outputTimezone?: string;\n /** 日時として解釈できない値に対する出力。既定は 'Invalid Date' */\n invalidText?: string;\n}\n\n/** タイムゾーンの略称。夏時間のないタイムゾーンでは daylight を持たない */\nexport interface TimezoneAbbreviation {\n standard: string;\n daylight?: string;\n}\n\n/** IANA名をキーにしたタイムゾーンの略称の表 */\nexport type TimezoneAbbreviations = Record<string, TimezoneAbbreviation>;\n\n/**\n * タイムゾーンの略称を解決するときのオプション\n */\nexport interface TimezoneAbbrOptions {\n /** 夏時間かどうかを判定する時点。既定は現在時刻 */\n at?: Date;\n /** 既定の表に追加・上書きする略称 */\n abbreviations?: TimezoneAbbreviations;\n}\n\nconst DEFAULT_TIMEZONE = 'UTC';\n\nconst TIMESTAMP_FORMAT = `yyyy-MM-dd'T'HH:mm:ss.SSSZZ`;\n\n/** 1970-01-01 を表すExcelの日付シリアル値 */\nconst EXCEL_EPOCH_SERIAL = 25569;\n\nconst MILLISECONDS_PER_DAY = 24 * 60 * 60 * 1000;\n\nconst MILLISECONDS_PER_HOUR = 60 * 60 * 1000;\n\nconst GMT_OFFSET = /GMT[+-]\\d{1,2}(:\\d{2})?/g;\n\n/**\n * 略称の既定の表。略称は世界で一意ではないため(CST は米国中部・中国などで使われる)、このライブラリが採用する表記である\n */\nconst DEFAULT_TIMEZONE_ABBREVIATIONS: TimezoneAbbreviations = {\n 'UTC': { standard: 'UTC' },\n 'Asia/Tokyo': { standard: 'JST' },\n 'Asia/Seoul': { standard: 'KST' },\n 'Asia/Shanghai': { standard: 'CST' },\n 'Asia/Hong_Kong': { standard: 'HKT' },\n 'Asia/Taipei': { standard: 'CST' },\n 'Asia/Singapore': { standard: 'SGT' },\n 'Asia/Manila': { standard: 'PHT' },\n 'Asia/Bangkok': { standard: 'ICT' },\n 'Asia/Ho_Chi_Minh': { standard: 'ICT' },\n 'Asia/Jakarta': { standard: 'WIB' },\n 'Asia/Kolkata': { standard: 'IST' },\n 'Asia/Dubai': { standard: 'GST' },\n 'Australia/Sydney': { standard: 'AEST', daylight: 'AEDT' },\n 'Pacific/Auckland': { standard: 'NZST', daylight: 'NZDT' },\n 'Europe/London': { standard: 'GMT', daylight: 'BST' },\n 'Europe/Paris': { standard: 'CET', daylight: 'CEST' },\n 'Europe/Berlin': { standard: 'CET', daylight: 'CEST' },\n 'Europe/Madrid': { standard: 'CET', daylight: 'CEST' },\n 'Europe/Rome': { standard: 'CET', daylight: 'CEST' },\n 'Europe/Amsterdam': { standard: 'CET', daylight: 'CEST' },\n 'America/New_York': { standard: 'EST', daylight: 'EDT' },\n 'America/Toronto': { standard: 'EST', daylight: 'EDT' },\n 'America/Chicago': { standard: 'CST', daylight: 'CDT' },\n 'America/Denver': { standard: 'MST', daylight: 'MDT' },\n 'America/Phoenix': { standard: 'MST' },\n 'America/Los_Angeles': { standard: 'PST', daylight: 'PDT' },\n 'America/Vancouver': { standard: 'PST', daylight: 'PDT' },\n 'America/Mexico_City': { standard: 'CST' },\n 'America/Sao_Paulo': { standard: 'BRT' }\n};\n\n/**\n * タイムゾーンの指定が不正な場合は、日時の不正とは区別して例外にする\n */\nconst assertZone = (d: DateTime): void => {\n if (!d.isValid && d.invalidReason === 'unsupported zone') {\n throw new RangeError(d.invalidExplanation ?? d.invalidReason);\n }\n};\n\nconst toDateTime = (value: DateInput, options?: ParseDateOptions): DateTime | null => {\n if (value == null || value === '') {\n return null;\n }\n const zone = options?.inputTimezone ?? DEFAULT_TIMEZONE;\n let d: DateTime | null = null;\n if (value instanceof Date) {\n d = DateTime.fromJSDate(value, { zone: zone });\n } else if (typeof value === 'number') {\n d = Number.isFinite(value) ? DateTime.fromMillis(value, { zone: zone }) : null;\n } else {\n const formats = options?.inputFormat ? [options.inputFormat].flat() : [];\n for (const format of formats) {\n const parsed = DateTime.fromFormat(value, format, { zone: zone });\n assertZone(parsed);\n if (parsed.isValid) {\n d = parsed;\n break;\n }\n }\n if (d == null) {\n d = DateTime.fromISO(value, { zone: zone });\n }\n }\n if (d == null) {\n return null;\n }\n assertZone(d);\n if (!d.isValid) {\n return null;\n }\n if (options?.duration) {\n d = d.plus(options.duration);\n }\n if (options?.startOf) {\n d = d.startOf(options.startOf);\n }\n if (options?.endOf) {\n d = d.endOf(options.endOf);\n }\n return d;\n};\n\nconst compare = (date1: DateInput, date2: DateInput, options: ParseDateOptions | undefined, predicate: (v1: number, v2: number) => boolean): boolean => {\n const d1 = toDateTime(date1, options);\n const d2 = toDateTime(date2, options);\n if (!d1 || !d2) {\n return false;\n }\n return predicate(d1.valueOf(), d2.valueOf());\n};\n\n/**\n * 値を日時として解釈し、Date を返す\n * duration / startOf / endOf は inputTimezone のゾーンで計算する\n * 解釈できない値、null / undefined / 空文字は null を返す。タイムゾーンの指定が不正な場合は RangeError をスローする\n *\n * @param {DateInput} value\n * @param {ParseDateOptions} [options]\n * @returns {Date | null}\n */\nexport function parseDate(value: DateInput, options?: ParseDateOptions): Date | null {\n return toDateTime(value, options)?.toJSDate() ?? null;\n}\n\n/**\n * 値を日時として解釈し、outputTimezone での文字列にする\n * value を省略して options だけを渡した場合は現在時刻を整形する\n * null / undefined / 空文字は空文字を返す。解釈できない値は 'Invalid Date' を返す\n * タイムゾーンの指定が不正な場合は RangeError をスローする\n *\n * @param {DateInput} value\n * @param {FormatDateOptions} [options]\n * @returns {string}\n */\nexport function formatDate(options: FormatDateOptions): string;\nexport function formatDate(value: DateInput, options?: FormatDateOptions): string;\nexport function formatDate(value: DateInput | FormatDateOptions, options?: FormatDateOptions): string {\n if (typeof value === 'object' && value !== null && !(value instanceof Date)) {\n return formatDate(new Date(), value);\n }\n if (value == null || value === '') {\n return '';\n }\n const d = toDateTime(value, options);\n if (!d) {\n return options?.invalidText ?? 'Invalid Date';\n }\n const output = d.setZone(options?.outputTimezone ?? DEFAULT_TIMEZONE);\n assertZone(output);\n return options?.outputFormat ? output.toFormat(options.outputFormat) : output.toISO() as string;\n}\n\n/**\n * 値が日時として解釈できるか判定する\n *\n * @param {DateInput} value\n * @param {ParseDateOptions} [options]\n * @returns {boolean}\n */\nexport function isValid(value: DateInput, options?: ParseDateOptions): boolean {\n return toDateTime(value, options) != null;\n}\n\n/**\n * date1 と date2 が同じ時刻か判定する。どちらかが解釈できない場合は false\n *\n * @param {DateInput} date1\n * @param {DateInput} date2\n * @param {ParseDateOptions} [options] 両方の値に適用する\n * @returns {boolean}\n */\nexport function isSame(date1: DateInput, date2: DateInput, options?: ParseDateOptions): boolean {\n return compare(date1, date2, options, (v1, v2) => v1 === v2);\n}\n\n/**\n * date1 が date2 より前の時刻か判定する。どちらかが解釈できない場合は false\n *\n * @param {DateInput} date1\n * @param {DateInput} date2\n * @param {ParseDateOptions} [options] 両方の値に適用する\n * @returns {boolean}\n */\nexport function isBefore(date1: DateInput, date2: DateInput, options?: ParseDateOptions): boolean {\n return compare(date1, date2, options, (v1, v2) => v1 < v2);\n}\n\n/**\n * date1 が date2 と同じか、より前の時刻か判定する。どちらかが解釈できない場合は false\n *\n * @param {DateInput} date1\n * @param {DateInput} date2\n * @param {ParseDateOptions} [options] 両方の値に適用する\n * @returns {boolean}\n */\nexport function isSameOrBefore(date1: DateInput, date2: DateInput, options?: ParseDateOptions): boolean {\n return compare(date1, date2, options, (v1, v2) => v1 <= v2);\n}\n\n/**\n * date1 が date2 より後の時刻か判定する。どちらかが解釈できない場合は false\n *\n * @param {DateInput} date1\n * @param {DateInput} date2\n * @param {ParseDateOptions} [options] 両方の値に適用する\n * @returns {boolean}\n */\nexport function isAfter(date1: DateInput, date2: DateInput, options?: ParseDateOptions): boolean {\n return compare(date1, date2, options, (v1, v2) => v2 < v1);\n}\n\n/**\n * date1 が date2 と同じか、より後の時刻か判定する。どちらかが解釈できない場合は false\n *\n * @param {DateInput} date1\n * @param {DateInput} date2\n * @param {ParseDateOptions} [options] 両方の値に適用する\n * @returns {boolean}\n */\nexport function isSameOrAfter(date1: DateInput, date2: DateInput, options?: ParseDateOptions): boolean {\n return compare(date1, date2, options, (v1, v2) => v2 <= v1);\n}\n\n/**\n * 値が inputTimezone での今日より前の日付か判定する。解釈できない場合は false\n *\n * @param {DateInput} value\n * @param {ParseDateOptions} [options]\n * @returns {boolean}\n */\nexport function isPastDate(value: DateInput, options?: ParseDateOptions): boolean {\n const target = toDateTime(value, options)?.startOf('day');\n if (!target) {\n return false;\n }\n const today = DateTime.now().setZone(options?.inputTimezone ?? DEFAULT_TIMEZONE).startOf('day');\n return target.valueOf() < today.valueOf();\n}\n\n/**\n * 値が現在時刻より前か判定する。解釈できない場合は false\n *\n * @param {DateInput} value\n * @param {ParseDateOptions} [options]\n * @returns {boolean}\n */\nexport function isPastDateTime(value: DateInput, options?: ParseDateOptions): boolean {\n const target = toDateTime(value, options);\n return target != null && target.valueOf() < Date.now();\n}\n\n/**\n * date1 − date2 を unit の単位で返す\n * 両方を inputTimezone で unit の始まりに切り捨ててから差を取るため、暦の上での差になる(23:00 と翌 01:00 の days は 1)\n * どちらかが解釈できない場合は NaN を返す\n *\n * @param {DateInput} date1\n * @param {DateInput} date2\n * @param {TimeUnit} unit\n * @param {ParseDateOptions} [options] 両方の値に適用する\n * @returns {number}\n */\nexport function diff(date1: DateInput, date2: DateInput, unit: TimeUnit, options?: ParseDateOptions): number {\n const d1 = toDateTime(date1, options);\n const d2 = toDateTime(date2, options);\n if (!d1 || !d2) {\n return NaN;\n }\n // 'days' → 'day' のように切り捨ての単位にする\n const dateUnit = unit.slice(0, -1) as DateTimeUnit;\n return d1.startOf(dateUnit).diff(d2.startOf(dateUnit), unit).get(unit);\n}\n\n/**\n * 現在時刻を timezone での 'yyyy-MM-ddTHH:mm:ss.SSS+HH:mm' 形式の文字列で返す\n *\n * @param {string} [timezone] IANA名。既定は 'UTC'\n * @returns {string}\n */\nexport function currentTimestamp(timezone: string = DEFAULT_TIMEZONE): string {\n const d = DateTime.now().setZone(timezone);\n assertZone(d);\n return d.toFormat(TIMESTAMP_FORMAT);\n}\n\n/**\n * Excelの日付シリアル値を epoch ミリ秒に変換する\n * Excelの日付シリアル値はゾーンの概念を持たないため、そのままではUTCの日時として変換される\n * シリアル値がどのゾーンの日時かが分かっている場合は offset に時間差を指定する\n *\n * @example\n * convertExcelDateSerialToUnixTimeSerial(45200); // 1696118400000 (2023-10-01T00:00:00Z)\n * convertExcelDateSerialToUnixTimeSerial(45200, { offset: 9 }); // 1696086000000 (2023-10-01T00:00:00+09:00)\n *\n * @param {number} excelDateSerial\n * @param {*} [options]\n * └ offset シリアル値のゾーンのUTCからの時間差(時)\n * @returns {number}\n */\nexport function convertExcelDateSerialToUnixTimeSerial(excelDateSerial: number, options?: {\n offset: number;\n}): number {\n let timeserial = (excelDateSerial - EXCEL_EPOCH_SERIAL) * MILLISECONDS_PER_DAY;\n if (options?.offset) {\n timeserial -= options.offset * MILLISECONDS_PER_HOUR;\n }\n return timeserial;\n}\n\n/**\n * 期間の値を別の単位に換算する\n * 月と年は固定長(1か月 = 30日、1年 = 365日)として換算する\n *\n * @example\n * convertTimeUnit(1, 'hours', 'milliseconds'); // 3600000\n *\n * @param {number} value\n * @param {TimeUnit} inputUnit\n * @param {TimeUnit} outputUnit\n * @returns {number}\n */\nexport function convertTimeUnit(value: number, inputUnit: TimeUnit, outputUnit: TimeUnit): number {\n return LuxonDuration.fromObject({ [inputUnit]: value }).as(outputUnit);\n}\n\n/**\n * timezone が at の時点で夏時間かどうかを返す\n * at を省略した場合は現在時刻で判定する。at が解釈できない場合は false を返す\n * タイムゾーンの指定が不正な場合は RangeError をスローする\n *\n * @param {string} timezone IANA名\n * @param {DateInput} [at] 判定する時点\n * @returns {boolean}\n */\nexport function isInDST(timezone: string, at?: DateInput): boolean {\n const d = at === undefined ? DateTime.now().setZone(timezone) : toDateTime(at)?.setZone(timezone);\n if (d == null) {\n return false;\n }\n assertZone(d);\n return d.isInDST;\n}\n\n/**\n * タイムゾーンの略称を返す。夏時間の期間中は夏時間の略称を返す\n * 既定の表にない場合は null を返す。表は options.abbreviations で追加・上書きできる\n *\n * @param {string} timezone IANA名\n * @param {TimezoneAbbrOptions} [options]\n * @returns {string | null}\n */\nexport function getTimezoneAbbr(timezone: string, options?: TimezoneAbbrOptions): string | null {\n const definition = { ...DEFAULT_TIMEZONE_ABBREVIATIONS, ...options?.abbreviations }[timezone];\n if (!definition) {\n return null;\n }\n if (definition.daylight) {\n const d = DateTime.fromJSDate(options?.at ?? new Date(), { zone: timezone });\n assertZone(d);\n if (d.isInDST) {\n return definition.daylight;\n }\n }\n return definition.standard;\n}\n\n/**\n * 文字列中の 'GMT+9' のようなオフセット表記を、timezone の略称に置き換える\n * 略称が解決できない場合は文字列をそのまま返す\n *\n * @param {string} text\n * @param {string} timezone IANA名\n * @param {TimezoneAbbrOptions} [options]\n * @returns {string}\n */\nexport function applyTimezoneAbbr(text: string, timezone: string, options?: TimezoneAbbrOptions): string {\n const abbr = getTimezoneAbbr(timezone, options);\n return abbr == null ? text : text.replace(GMT_OFFSET, abbr);\n}\n"],"names":["DEFAULT_TIMEZONE","TIMESTAMP_FORMAT","EXCEL_EPOCH_SERIAL","MILLISECONDS_PER_DAY","MILLISECONDS_PER_HOUR","GMT_OFFSET","DEFAULT_TIMEZONE_ABBREVIATIONS","assertZone","d","toDateTime","value","options","zone","DateTime","formats","format","parsed","compare","date1","date2","predicate","d1","d2","parseDate","formatDate","output","isValid","isSame","v1","v2","isBefore","isSameOrBefore","isAfter","isSameOrAfter","isPastDate","target","today","isPastDateTime","diff","unit","dateUnit","currentTimestamp","timezone","convertExcelDateSerialToUnixTimeSerial","excelDateSerial","timeserial","convertTimeUnit","inputUnit","outputUnit","LuxonDuration","isInDST","at","getTimezoneAbbr","definition","applyTimezoneAbbr","text","abbr"],"mappings":"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"}
|
package/lib/date-util.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});require("luxon");const e=require("./date-util-
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});require("luxon");const e=require("./date-util-b1Lw7Nyu.cjs");exports.applyTimezoneAbbr=e.applyTimezoneAbbr;exports.convertExcelDateSerialToUnixTimeSerial=e.convertExcelDateSerialToUnixTimeSerial;exports.convertTimeUnit=e.convertTimeUnit;exports.currentTimestamp=e.currentTimestamp;exports.diff=e.diff;exports.formatDate=e.formatDate;exports.getTimezoneAbbr=e.getTimezoneAbbr;exports.isAfter=e.isAfter;exports.isBefore=e.isBefore;exports.isInDST=e.isInDST;exports.isPastDate=e.isPastDate;exports.isPastDateTime=e.isPastDateTime;exports.isSame=e.isSame;exports.isSameOrAfter=e.isSameOrAfter;exports.isSameOrBefore=e.isSameOrBefore;exports.isValid=e.isValid;exports.parseDate=e.parseDate;
|
|
2
2
|
//# sourceMappingURL=date-util.cjs.map
|
package/lib/date-util.d.cts
CHANGED
|
@@ -198,6 +198,16 @@ export declare function convertExcelDateSerialToUnixTimeSerial(excelDateSerial:
|
|
|
198
198
|
* @returns {number}
|
|
199
199
|
*/
|
|
200
200
|
export declare function convertTimeUnit(value: number, inputUnit: TimeUnit, outputUnit: TimeUnit): number;
|
|
201
|
+
/**
|
|
202
|
+
* timezone が at の時点で夏時間かどうかを返す
|
|
203
|
+
* at を省略した場合は現在時刻で判定する。at が解釈できない場合は false を返す
|
|
204
|
+
* タイムゾーンの指定が不正な場合は RangeError をスローする
|
|
205
|
+
*
|
|
206
|
+
* @param {string} timezone IANA名
|
|
207
|
+
* @param {DateInput} [at] 判定する時点
|
|
208
|
+
* @returns {boolean}
|
|
209
|
+
*/
|
|
210
|
+
export declare function isInDST(timezone: string, at?: DateInput): boolean;
|
|
201
211
|
/**
|
|
202
212
|
* タイムゾーンの略称を返す。夏時間の期間中は夏時間の略称を返す
|
|
203
213
|
* 既定の表にない場合は null を返す。表は options.abbreviations で追加・上書きできる
|
package/lib/date-util.d.ts
CHANGED
|
@@ -198,6 +198,16 @@ export declare function convertExcelDateSerialToUnixTimeSerial(excelDateSerial:
|
|
|
198
198
|
* @returns {number}
|
|
199
199
|
*/
|
|
200
200
|
export declare function convertTimeUnit(value: number, inputUnit: TimeUnit, outputUnit: TimeUnit): number;
|
|
201
|
+
/**
|
|
202
|
+
* timezone が at の時点で夏時間かどうかを返す
|
|
203
|
+
* at を省略した場合は現在時刻で判定する。at が解釈できない場合は false を返す
|
|
204
|
+
* タイムゾーンの指定が不正な場合は RangeError をスローする
|
|
205
|
+
*
|
|
206
|
+
* @param {string} timezone IANA名
|
|
207
|
+
* @param {DateInput} [at] 判定する時点
|
|
208
|
+
* @returns {boolean}
|
|
209
|
+
*/
|
|
210
|
+
export declare function isInDST(timezone: string, at?: DateInput): boolean;
|
|
201
211
|
/**
|
|
202
212
|
* タイムゾーンの略称を返す。夏時間の期間中は夏時間の略称を返す
|
|
203
213
|
* 既定の表にない場合は null を返す。表は options.abbreviations で追加・上書きできる
|
package/lib/date-util.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import "luxon";
|
|
2
|
-
import { a as i, c as r, b as t, e as m, f as o, g as f, h as n, i as
|
|
2
|
+
import { a as i, c as r, b as t, e as m, f as o, g as f, h as n, i as T, j as p, k as l, l as D, m as S, n as b, o as c, p as A, q as x, r as d } from "./date-util-DrfUsv9b.js";
|
|
3
3
|
export {
|
|
4
4
|
i as applyTimezoneAbbr,
|
|
5
5
|
r as convertExcelDateSerialToUnixTimeSerial,
|
|
@@ -8,14 +8,15 @@ export {
|
|
|
8
8
|
o as diff,
|
|
9
9
|
f as formatDate,
|
|
10
10
|
n as getTimezoneAbbr,
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
l as
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
A as
|
|
19
|
-
x as
|
|
11
|
+
T as isAfter,
|
|
12
|
+
p as isBefore,
|
|
13
|
+
l as isInDST,
|
|
14
|
+
D as isPastDate,
|
|
15
|
+
S as isPastDateTime,
|
|
16
|
+
b as isSame,
|
|
17
|
+
c as isSameOrAfter,
|
|
18
|
+
A as isSameOrBefore,
|
|
19
|
+
x as isValid,
|
|
20
|
+
d as parseDate
|
|
20
21
|
};
|
|
21
22
|
//# sourceMappingURL=date-util.js.map
|
package/lib/index.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("./crypto-util-BcHurtbE.cjs"),i=require("./date-util-
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("./crypto-util-BcHurtbE.cjs"),i=require("./date-util-b1Lw7Nyu.cjs"),e=require("./decimal.cjs"),l=require("./file-util-D09BvDYY.cjs"),r=require("./html-util-ClGIpzW1.cjs"),U=require("./json-util-5mq7fsX_.cjs"),o=require("./number-util-BrDEKYJo.cjs"),c=require("./object-util-Cc1SmN-8.cjs"),n=require("./string-util-w2I5EYuY.cjs");exports.CryptoUtil=t.cryptoUtil;exports.DateUtil=i.dateUtil;exports.Decimal=e.Decimal;exports.FileUtil=l.fileUtil;exports.HtmlUtil=r.htmlUtil;exports.JsonUtil=U.jsonUtil;exports.NumberUtil=o.numberUtil;exports.ObjectUtil=c.objectUtil;exports.StringUtil=n.stringUtil;
|
|
2
2
|
//# sourceMappingURL=index.cjs.map
|
package/lib/index.js
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { c as r } from "./crypto-util-B5K2CmE2.js";
|
|
2
|
-
import { d as m } from "./date-util-
|
|
2
|
+
import { d as m } from "./date-util-DrfUsv9b.js";
|
|
3
3
|
import { Decimal as l } from "./decimal.js";
|
|
4
4
|
import { f } from "./file-util-H-c_eQcd.js";
|
|
5
5
|
import { h as s } from "./html-util-CcRJtzod.js";
|
|
6
6
|
import { j as U } from "./json-util-CF-O1b7m.js";
|
|
7
7
|
import { n } from "./number-util-Wpubbqr4.js";
|
|
8
|
-
import { o as j } from "./object-util-
|
|
8
|
+
import { o as j } from "./object-util-BGqczDbJ.js";
|
|
9
9
|
import { s as d } from "./string-util-Cw0VgbIH.js";
|
|
10
10
|
export {
|
|
11
11
|
r as CryptoUtil,
|