@digitalwalletcorp/utils 0.11.0 → 0.12.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/README.md +1 -1
- package/lib/{date-util-C581gVKx.js → date-util-BNe2E-tA.js} +4 -4
- package/lib/date-util-BNe2E-tA.js.map +1 -0
- package/lib/date-util-CZmiQEYH.cjs +2 -0
- package/lib/date-util-CZmiQEYH.cjs.map +1 -0
- package/lib/date-util.cjs +1 -1
- package/lib/date-util.d.cts +3 -3
- package/lib/date-util.d.ts +3 -3
- package/lib/date-util.js +2 -2
- package/lib/index.cjs +1 -1
- package/lib/index.d.cts +1 -1
- package/lib/index.d.ts +1 -1
- package/lib/index.js +8 -8
- package/lib/{date-time.cjs → zoned-date-time.cjs} +2 -2
- package/lib/zoned-date-time.cjs.map +1 -0
- package/lib/{date-time.d.cts → zoned-date-time.d.cts} +37 -37
- package/lib/{date-time.d.ts → zoned-date-time.d.ts} +37 -37
- package/lib/{date-time.js → zoned-date-time.js} +39 -39
- package/lib/zoned-date-time.js.map +1 -0
- package/package.json +1 -1
- package/src/date-util.ts +17 -17
- package/src/index.ts +1 -1
- package/src/{date-time.ts → zoned-date-time.ts} +58 -58
- package/lib/date-time.cjs.map +0 -1
- package/lib/date-time.js.map +0 -1
- package/lib/date-util-ByW86YIS.cjs +0 -2
- package/lib/date-util-ByW86YIS.cjs.map +0 -1
- package/lib/date-util-C581gVKx.js.map +0 -1
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* このクラス
|
|
2
|
+
* このクラス ZonedDateTime の役割は、日時演算の実体としての luxon を内部に閉じ込め、利用者側に露出させないことにある
|
|
3
3
|
*/
|
|
4
|
-
import { DateTime
|
|
4
|
+
import { DateTime } from 'luxon';
|
|
5
5
|
import type { DateInput, DateUnit, Duration, ParseDateOptions, TimeUnit } from './date-util';
|
|
6
6
|
|
|
7
7
|
/** set で変更する日時の要素。month は1〜12 */
|
|
8
|
-
export interface
|
|
8
|
+
export interface ZonedDateTimeFields {
|
|
9
9
|
year?: number;
|
|
10
10
|
month?: number;
|
|
11
11
|
day?: number;
|
|
@@ -18,7 +18,7 @@ export interface DateTimeFields {
|
|
|
18
18
|
/**
|
|
19
19
|
* 日時を文字列にするときのオプション
|
|
20
20
|
*/
|
|
21
|
-
export interface
|
|
21
|
+
export interface ZonedDateTimeFormatOptions {
|
|
22
22
|
/** 月名・曜日名に使うロケール。既定は 'en-US' */
|
|
23
23
|
locale?: string;
|
|
24
24
|
}
|
|
@@ -30,7 +30,7 @@ const DEFAULT_LOCALE = 'en-US';
|
|
|
30
30
|
/**
|
|
31
31
|
* タイムゾーンの指定が不正な場合は、日時の不正とは区別して例外にする
|
|
32
32
|
*/
|
|
33
|
-
const assertZone = (d:
|
|
33
|
+
const assertZone = (d: DateTime): void => {
|
|
34
34
|
if (!d.isValid && d.invalidReason === 'unsupported zone') {
|
|
35
35
|
throw new RangeError(d.invalidExplanation ?? d.invalidReason);
|
|
36
36
|
}
|
|
@@ -39,7 +39,7 @@ const assertZone = (d: LuxonDateTime): void => {
|
|
|
39
39
|
/**
|
|
40
40
|
* set に渡された要素が min〜max の整数であることを確かめる
|
|
41
41
|
*/
|
|
42
|
-
const assertField = (name: keyof
|
|
42
|
+
const assertField = (name: keyof ZonedDateTimeFields, value: number | undefined, min: number, max: number): void => {
|
|
43
43
|
if (value === undefined) {
|
|
44
44
|
return;
|
|
45
45
|
}
|
|
@@ -53,13 +53,13 @@ const assertField = (name: keyof DateTimeFields, value: number | undefined, min:
|
|
|
53
53
|
* 演算メソッドは自身を変更せず、結果を新しいインスタンスで返す
|
|
54
54
|
* インスタンスごとにタイムゾーンを持ち、startOf / endOf / set や各要素の参照はそのタイムゾーンで計算する
|
|
55
55
|
*/
|
|
56
|
-
export class
|
|
56
|
+
export class ZonedDateTime {
|
|
57
57
|
/**
|
|
58
58
|
* 日時演算インスタンス
|
|
59
59
|
*/
|
|
60
|
-
private dateTime:
|
|
60
|
+
private dateTime: DateTime;
|
|
61
61
|
|
|
62
|
-
private constructor(dateTime:
|
|
62
|
+
private constructor(dateTime: DateTime) {
|
|
63
63
|
this.dateTime = dateTime;
|
|
64
64
|
}
|
|
65
65
|
|
|
@@ -68,42 +68,42 @@ export class DateTime {
|
|
|
68
68
|
* タイムゾーンの指定が不正な場合は RangeError をスローする
|
|
69
69
|
*
|
|
70
70
|
* @param {string} [timezone] IANA名。既定は 'UTC'
|
|
71
|
-
* @returns {
|
|
71
|
+
* @returns {ZonedDateTime}
|
|
72
72
|
*/
|
|
73
|
-
public static now(timezone: string = DEFAULT_TIMEZONE):
|
|
74
|
-
const d =
|
|
73
|
+
public static now(timezone: string = DEFAULT_TIMEZONE): ZonedDateTime {
|
|
74
|
+
const d = DateTime.now().setZone(timezone);
|
|
75
75
|
assertZone(d);
|
|
76
|
-
return new
|
|
76
|
+
return new ZonedDateTime(d);
|
|
77
77
|
}
|
|
78
78
|
|
|
79
79
|
/**
|
|
80
80
|
* 値を日時として解釈する
|
|
81
81
|
* 生成したインスタンスは inputTimezone のタイムゾーンを持つ
|
|
82
|
-
*
|
|
82
|
+
* ZonedDateTime を渡した場合、inputTimezone を省略すると渡した ZonedDateTime のタイムゾーンを引き継ぐ
|
|
83
83
|
* duration / startOf / endOf はそのタイムゾーンで計算する
|
|
84
84
|
* 解釈できない値、null / undefined / 空文字は null を返す。タイムゾーンの指定が不正な場合は RangeError をスローする
|
|
85
85
|
*
|
|
86
86
|
* @param {DateInput} value
|
|
87
87
|
* @param {ParseDateOptions} [options]
|
|
88
|
-
* @returns {
|
|
88
|
+
* @returns {ZonedDateTime | null}
|
|
89
89
|
*/
|
|
90
|
-
public static parse(value: DateInput, options?: ParseDateOptions):
|
|
90
|
+
public static parse(value: DateInput, options?: ParseDateOptions): ZonedDateTime | null {
|
|
91
91
|
if (value == null || value === '') {
|
|
92
92
|
return null;
|
|
93
93
|
}
|
|
94
94
|
const zone = options?.inputTimezone ?? DEFAULT_TIMEZONE;
|
|
95
|
-
let d:
|
|
96
|
-
if (value instanceof
|
|
95
|
+
let d: DateTime | null = null;
|
|
96
|
+
if (value instanceof ZonedDateTime) {
|
|
97
97
|
d = options?.inputTimezone ? value.dateTime.setZone(options.inputTimezone) : value.dateTime;
|
|
98
98
|
} else if (value instanceof Date) {
|
|
99
|
-
d =
|
|
99
|
+
d = DateTime.fromJSDate(value, { zone: zone });
|
|
100
100
|
} else if (typeof value === 'number') {
|
|
101
|
-
d = Number.isFinite(value) ?
|
|
101
|
+
d = Number.isFinite(value) ? DateTime.fromMillis(value, { zone: zone }) : null;
|
|
102
102
|
} else {
|
|
103
103
|
const locale = options?.locale ?? DEFAULT_LOCALE;
|
|
104
104
|
const formats = options?.inputFormat ? [options.inputFormat].flat() : [];
|
|
105
105
|
for (const format of formats) {
|
|
106
|
-
const parsed =
|
|
106
|
+
const parsed = DateTime.fromFormat(value, format, {
|
|
107
107
|
zone: zone,
|
|
108
108
|
locale: locale
|
|
109
109
|
});
|
|
@@ -114,7 +114,7 @@ export class DateTime {
|
|
|
114
114
|
}
|
|
115
115
|
}
|
|
116
116
|
if (d == null) {
|
|
117
|
-
d =
|
|
117
|
+
d = DateTime.fromISO(value, { zone: zone });
|
|
118
118
|
}
|
|
119
119
|
}
|
|
120
120
|
if (d == null) {
|
|
@@ -133,7 +133,7 @@ export class DateTime {
|
|
|
133
133
|
if (options?.endOf) {
|
|
134
134
|
d = d.endOf(options.endOf);
|
|
135
135
|
}
|
|
136
|
-
return new
|
|
136
|
+
return new ZonedDateTime(d);
|
|
137
137
|
}
|
|
138
138
|
|
|
139
139
|
/** 年 */
|
|
@@ -196,20 +196,20 @@ export class DateTime {
|
|
|
196
196
|
* 負の値を指定すると減算になる
|
|
197
197
|
*
|
|
198
198
|
* @param {Duration} duration
|
|
199
|
-
* @returns {
|
|
199
|
+
* @returns {ZonedDateTime}
|
|
200
200
|
*/
|
|
201
|
-
public plus(duration: Duration):
|
|
202
|
-
return new
|
|
201
|
+
public plus(duration: Duration): ZonedDateTime {
|
|
202
|
+
return new ZonedDateTime(this.dateTime.plus(duration));
|
|
203
203
|
}
|
|
204
204
|
|
|
205
205
|
/**
|
|
206
206
|
* 期間を減算した結果を返す
|
|
207
207
|
*
|
|
208
208
|
* @param {Duration} duration
|
|
209
|
-
* @returns {
|
|
209
|
+
* @returns {ZonedDateTime}
|
|
210
210
|
*/
|
|
211
|
-
public minus(duration: Duration):
|
|
212
|
-
return new
|
|
211
|
+
public minus(duration: Duration): ZonedDateTime {
|
|
212
|
+
return new ZonedDateTime(this.dateTime.minus(duration));
|
|
213
213
|
}
|
|
214
214
|
|
|
215
215
|
/**
|
|
@@ -217,10 +217,10 @@ export class DateTime {
|
|
|
217
217
|
* week は月曜始まりで切り捨てる
|
|
218
218
|
*
|
|
219
219
|
* @param {DateUnit} unit
|
|
220
|
-
* @returns {
|
|
220
|
+
* @returns {ZonedDateTime}
|
|
221
221
|
*/
|
|
222
|
-
public startOf(unit: DateUnit):
|
|
223
|
-
return new
|
|
222
|
+
public startOf(unit: DateUnit): ZonedDateTime {
|
|
223
|
+
return new ZonedDateTime(this.dateTime.startOf(unit));
|
|
224
224
|
}
|
|
225
225
|
|
|
226
226
|
/**
|
|
@@ -228,10 +228,10 @@ export class DateTime {
|
|
|
228
228
|
* week は日曜終わりで切り上げる
|
|
229
229
|
*
|
|
230
230
|
* @param {DateUnit} unit
|
|
231
|
-
* @returns {
|
|
231
|
+
* @returns {ZonedDateTime}
|
|
232
232
|
*/
|
|
233
|
-
public endOf(unit: DateUnit):
|
|
234
|
-
return new
|
|
233
|
+
public endOf(unit: DateUnit): ZonedDateTime {
|
|
234
|
+
return new ZonedDateTime(this.dateTime.endOf(unit));
|
|
235
235
|
}
|
|
236
236
|
|
|
237
237
|
/**
|
|
@@ -239,10 +239,10 @@ export class DateTime {
|
|
|
239
239
|
* 範囲外の値や整数でない値を指定した場合は RangeError をスローする
|
|
240
240
|
* day を指定せずに year / month を変更し、日がその月に無い場合は月末日にする(1月31日に { month: 2 } なら2月末日)
|
|
241
241
|
*
|
|
242
|
-
* @param {
|
|
243
|
-
* @returns {
|
|
242
|
+
* @param {ZonedDateTimeFields} fields
|
|
243
|
+
* @returns {ZonedDateTime}
|
|
244
244
|
*/
|
|
245
|
-
public set(fields:
|
|
245
|
+
public set(fields: ZonedDateTimeFields): ZonedDateTime {
|
|
246
246
|
assertField('month', fields.month, 1, 12);
|
|
247
247
|
assertField('hour', fields.hour, 0, 23);
|
|
248
248
|
assertField('minute', fields.minute, 0, 59);
|
|
@@ -255,7 +255,7 @@ export class DateTime {
|
|
|
255
255
|
day: 1
|
|
256
256
|
}).daysInMonth as number;
|
|
257
257
|
assertField('day', fields.day, 1, daysInMonth);
|
|
258
|
-
return new
|
|
258
|
+
return new ZonedDateTime(this.dateTime.set(fields));
|
|
259
259
|
}
|
|
260
260
|
|
|
261
261
|
/**
|
|
@@ -263,23 +263,23 @@ export class DateTime {
|
|
|
263
263
|
* タイムゾーンの指定が不正な場合は RangeError をスローする
|
|
264
264
|
*
|
|
265
265
|
* @param {string} timezone IANA名
|
|
266
|
-
* @returns {
|
|
266
|
+
* @returns {ZonedDateTime}
|
|
267
267
|
*/
|
|
268
|
-
public setZone(timezone: string):
|
|
268
|
+
public setZone(timezone: string): ZonedDateTime {
|
|
269
269
|
const d = this.dateTime.setZone(timezone);
|
|
270
270
|
assertZone(d);
|
|
271
|
-
return new
|
|
271
|
+
return new ZonedDateTime(d);
|
|
272
272
|
}
|
|
273
273
|
|
|
274
274
|
/**
|
|
275
275
|
* 自身 − other を unit の単位で返す
|
|
276
276
|
* 両方を自身のタイムゾーンで unit の始まりに切り捨ててから差を取るため、暦の上での差になる(23:00 と翌 01:00 の days は 1)
|
|
277
277
|
*
|
|
278
|
-
* @param {
|
|
278
|
+
* @param {ZonedDateTime} other
|
|
279
279
|
* @param {TimeUnit} unit
|
|
280
280
|
* @returns {number}
|
|
281
281
|
*/
|
|
282
|
-
public diff(other:
|
|
282
|
+
public diff(other: ZonedDateTime, unit: TimeUnit): number {
|
|
283
283
|
// 'days' → 'day' のように切り捨ての単位にする
|
|
284
284
|
const dateUnit = unit.slice(0, -1) as DateUnit;
|
|
285
285
|
const target = other.dateTime.setZone(this.dateTime.zone);
|
|
@@ -289,60 +289,60 @@ export class DateTime {
|
|
|
289
289
|
/**
|
|
290
290
|
* 時刻を比較する。タイムゾーンが異なっていても同じ時刻なら等しい
|
|
291
291
|
*
|
|
292
|
-
* @param {
|
|
292
|
+
* @param {ZonedDateTime} other
|
|
293
293
|
* @returns {-1 | 0 | 1} 自身が前なら-1、等しければ0、後なら1
|
|
294
294
|
*/
|
|
295
|
-
public compareTo(other:
|
|
295
|
+
public compareTo(other: ZonedDateTime): -1 | 0 | 1 {
|
|
296
296
|
return Math.sign(this.toMillis() - other.toMillis()) as -1 | 0 | 1;
|
|
297
297
|
}
|
|
298
298
|
|
|
299
299
|
/**
|
|
300
300
|
* 同じ時刻か判定する
|
|
301
301
|
*
|
|
302
|
-
* @param {
|
|
302
|
+
* @param {ZonedDateTime} other
|
|
303
303
|
* @returns {boolean}
|
|
304
304
|
*/
|
|
305
|
-
public eq(other:
|
|
305
|
+
public eq(other: ZonedDateTime): boolean {
|
|
306
306
|
return this.compareTo(other) === 0;
|
|
307
307
|
}
|
|
308
308
|
|
|
309
309
|
/**
|
|
310
310
|
* 自身が前の時刻か判定する
|
|
311
311
|
*
|
|
312
|
-
* @param {
|
|
312
|
+
* @param {ZonedDateTime} other
|
|
313
313
|
* @returns {boolean}
|
|
314
314
|
*/
|
|
315
|
-
public lt(other:
|
|
315
|
+
public lt(other: ZonedDateTime): boolean {
|
|
316
316
|
return this.compareTo(other) < 0;
|
|
317
317
|
}
|
|
318
318
|
|
|
319
319
|
/**
|
|
320
320
|
* 自身が前か同じ時刻か判定する
|
|
321
321
|
*
|
|
322
|
-
* @param {
|
|
322
|
+
* @param {ZonedDateTime} other
|
|
323
323
|
* @returns {boolean}
|
|
324
324
|
*/
|
|
325
|
-
public lte(other:
|
|
325
|
+
public lte(other: ZonedDateTime): boolean {
|
|
326
326
|
return this.compareTo(other) <= 0;
|
|
327
327
|
}
|
|
328
328
|
|
|
329
329
|
/**
|
|
330
330
|
* 自身が後の時刻か判定する
|
|
331
331
|
*
|
|
332
|
-
* @param {
|
|
332
|
+
* @param {ZonedDateTime} other
|
|
333
333
|
* @returns {boolean}
|
|
334
334
|
*/
|
|
335
|
-
public gt(other:
|
|
335
|
+
public gt(other: ZonedDateTime): boolean {
|
|
336
336
|
return 0 < this.compareTo(other);
|
|
337
337
|
}
|
|
338
338
|
|
|
339
339
|
/**
|
|
340
340
|
* 自身が後か同じ時刻か判定する
|
|
341
341
|
*
|
|
342
|
-
* @param {
|
|
342
|
+
* @param {ZonedDateTime} other
|
|
343
343
|
* @returns {boolean}
|
|
344
344
|
*/
|
|
345
|
-
public gte(other:
|
|
345
|
+
public gte(other: ZonedDateTime): boolean {
|
|
346
346
|
return 0 <= this.compareTo(other);
|
|
347
347
|
}
|
|
348
348
|
|
|
@@ -350,10 +350,10 @@ export class DateTime {
|
|
|
350
350
|
* 自身のタイムゾーンで、指定した書式の文字列にする
|
|
351
351
|
*
|
|
352
352
|
* @param {string} outputFormat
|
|
353
|
-
* @param {
|
|
353
|
+
* @param {ZonedDateTimeFormatOptions} [options]
|
|
354
354
|
* @returns {string}
|
|
355
355
|
*/
|
|
356
|
-
public format(outputFormat: string, options?:
|
|
356
|
+
public format(outputFormat: string, options?: ZonedDateTimeFormatOptions): string {
|
|
357
357
|
return this.dateTime.toFormat(outputFormat, { locale: options?.locale ?? DEFAULT_LOCALE });
|
|
358
358
|
}
|
|
359
359
|
|
package/lib/date-time.cjs.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"date-time.cjs","sources":["../src/date-time.ts"],"sourcesContent":["/**\n * このクラス DateTime の役割は、日時演算の実体としての luxon を内部に閉じ込め、利用者側に露出させないことにある\n */\nimport { DateTime as LuxonDateTime } from 'luxon';\nimport type { DateInput, DateUnit, Duration, ParseDateOptions, TimeUnit } from './date-util';\n\n/** set で変更する日時の要素。month は1〜12 */\nexport interface DateTimeFields {\n year?: number;\n month?: number;\n day?: number;\n hour?: number;\n minute?: number;\n second?: number;\n millisecond?: number;\n}\n\n/**\n * 日時を文字列にするときのオプション\n */\nexport interface DateTimeFormatOptions {\n /** 月名・曜日名に使うロケール。既定は 'en-US' */\n locale?: string;\n}\n\nconst DEFAULT_TIMEZONE = 'UTC';\n\nconst DEFAULT_LOCALE = 'en-US';\n\n/**\n * タイムゾーンの指定が不正な場合は、日時の不正とは区別して例外にする\n */\nconst assertZone = (d: LuxonDateTime): void => {\n if (!d.isValid && d.invalidReason === 'unsupported zone') {\n throw new RangeError(d.invalidExplanation ?? d.invalidReason);\n }\n};\n\n/**\n * set に渡された要素が min〜max の整数であることを確かめる\n */\nconst assertField = (name: keyof DateTimeFields, value: number | undefined, min: number, max: number): void => {\n if (value === undefined) {\n return;\n }\n if (!Number.isInteger(value) || value < min || max < value) {\n throw new RangeError(`${name} must be an integer from ${min} to ${max}: ${value}`);\n }\n};\n\n/**\n * 日時を表す不変オブジェクト\n * 演算メソッドは自身を変更せず、結果を新しいインスタンスで返す\n * インスタンスごとにタイムゾーンを持ち、startOf / endOf / set や各要素の参照はそのタイムゾーンで計算する\n */\nexport class DateTime {\n /**\n * 日時演算インスタンス\n */\n private dateTime: LuxonDateTime;\n\n private constructor(dateTime: LuxonDateTime) {\n this.dateTime = dateTime;\n }\n\n /**\n * 現在時刻を返す\n * タイムゾーンの指定が不正な場合は RangeError をスローする\n *\n * @param {string} [timezone] IANA名。既定は 'UTC'\n * @returns {DateTime}\n */\n public static now(timezone: string = DEFAULT_TIMEZONE): DateTime {\n const d = LuxonDateTime.now().setZone(timezone);\n assertZone(d);\n return new DateTime(d);\n }\n\n /**\n * 値を日時として解釈する\n * 生成したインスタンスは inputTimezone のタイムゾーンを持つ\n * DateTime を渡した場合、inputTimezone を省略すると渡した DateTime のタイムゾーンを引き継ぐ\n * duration / startOf / endOf はそのタイムゾーンで計算する\n * 解釈できない値、null / undefined / 空文字は null を返す。タイムゾーンの指定が不正な場合は RangeError をスローする\n *\n * @param {DateInput} value\n * @param {ParseDateOptions} [options]\n * @returns {DateTime | null}\n */\n public static parse(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: LuxonDateTime | null = null;\n if (value instanceof DateTime) {\n d = options?.inputTimezone ? value.dateTime.setZone(options.inputTimezone) : value.dateTime;\n } else if (value instanceof Date) {\n d = LuxonDateTime.fromJSDate(value, { zone: zone });\n } else if (typeof value === 'number') {\n d = Number.isFinite(value) ? LuxonDateTime.fromMillis(value, { zone: zone }) : null;\n } else {\n const locale = options?.locale ?? DEFAULT_LOCALE;\n const formats = options?.inputFormat ? [options.inputFormat].flat() : [];\n for (const format of formats) {\n const parsed = LuxonDateTime.fromFormat(value, format, {\n zone: zone,\n locale: locale\n });\n assertZone(parsed);\n if (parsed.isValid) {\n d = parsed;\n break;\n }\n }\n if (d == null) {\n d = LuxonDateTime.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 new DateTime(d);\n }\n\n /** 年 */\n public get year(): number {\n return this.dateTime.year;\n }\n\n /** 月(1〜12) */\n public get month(): number {\n return this.dateTime.month;\n }\n\n /** 日 */\n public get day(): number {\n return this.dateTime.day;\n }\n\n /** 時 */\n public get hour(): number {\n return this.dateTime.hour;\n }\n\n /** 分 */\n public get minute(): number {\n return this.dateTime.minute;\n }\n\n /** 秒 */\n public get second(): number {\n return this.dateTime.second;\n }\n\n /** ミリ秒 */\n public get millisecond(): number {\n return this.dateTime.millisecond;\n }\n\n /** 曜日。月曜が1、日曜が7 */\n public get weekday(): number {\n return this.dateTime.weekday;\n }\n\n /** その月の日数 */\n public get daysInMonth(): number {\n return this.dateTime.daysInMonth as number;\n }\n\n /** 夏時間の期間中か */\n public get isInDST(): boolean {\n return this.dateTime.isInDST;\n }\n\n /** タイムゾーン(IANA名) */\n public get timezone(): string {\n return this.dateTime.zoneName as string;\n }\n\n /**\n * 期間を加算した結果を返す\n * 負の値を指定すると減算になる\n *\n * @param {Duration} duration\n * @returns {DateTime}\n */\n public plus(duration: Duration): DateTime {\n return new DateTime(this.dateTime.plus(duration));\n }\n\n /**\n * 期間を減算した結果を返す\n *\n * @param {Duration} duration\n * @returns {DateTime}\n */\n public minus(duration: Duration): DateTime {\n return new DateTime(this.dateTime.minus(duration));\n }\n\n /**\n * 指定した単位の最初の時点に切り捨てた結果を返す(month なら月初の00:00:00.000)\n * week は月曜始まりで切り捨てる\n *\n * @param {DateUnit} unit\n * @returns {DateTime}\n */\n public startOf(unit: DateUnit): DateTime {\n return new DateTime(this.dateTime.startOf(unit));\n }\n\n /**\n * 指定した単位の最後の時点に切り上げた結果を返す(month なら月末の23:59:59.999)\n * week は日曜終わりで切り上げる\n *\n * @param {DateUnit} unit\n * @returns {DateTime}\n */\n public endOf(unit: DateUnit): DateTime {\n return new DateTime(this.dateTime.endOf(unit));\n }\n\n /**\n * 指定した要素を変更した結果を返す\n * 範囲外の値や整数でない値を指定した場合は RangeError をスローする\n * day を指定せずに year / month を変更し、日がその月に無い場合は月末日にする(1月31日に { month: 2 } なら2月末日)\n *\n * @param {DateTimeFields} fields\n * @returns {DateTime}\n */\n public set(fields: DateTimeFields): DateTime {\n assertField('month', fields.month, 1, 12);\n assertField('hour', fields.hour, 0, 23);\n assertField('minute', fields.minute, 0, 59);\n assertField('second', fields.second, 0, 59);\n assertField('millisecond', fields.millisecond, 0, 999);\n // day の上限は変更後の年月で決まる\n const daysInMonth = this.dateTime.set({\n year: fields.year ?? this.year,\n month: fields.month ?? this.month,\n day: 1\n }).daysInMonth as number;\n assertField('day', fields.day, 1, daysInMonth);\n return new DateTime(this.dateTime.set(fields));\n }\n\n /**\n * 同じ時刻を別のタイムゾーンで表した結果を返す\n * タイムゾーンの指定が不正な場合は RangeError をスローする\n *\n * @param {string} timezone IANA名\n * @returns {DateTime}\n */\n public setZone(timezone: string): DateTime {\n const d = this.dateTime.setZone(timezone);\n assertZone(d);\n return new DateTime(d);\n }\n\n /**\n * 自身 − other を unit の単位で返す\n * 両方を自身のタイムゾーンで unit の始まりに切り捨ててから差を取るため、暦の上での差になる(23:00 と翌 01:00 の days は 1)\n *\n * @param {DateTime} other\n * @param {TimeUnit} unit\n * @returns {number}\n */\n public diff(other: DateTime, unit: TimeUnit): number {\n // 'days' → 'day' のように切り捨ての単位にする\n const dateUnit = unit.slice(0, -1) as DateUnit;\n const target = other.dateTime.setZone(this.dateTime.zone);\n return this.dateTime.startOf(dateUnit).diff(target.startOf(dateUnit), unit).get(unit);\n }\n\n /**\n * 時刻を比較する。タイムゾーンが異なっていても同じ時刻なら等しい\n *\n * @param {DateTime} other\n * @returns {-1 | 0 | 1} 自身が前なら-1、等しければ0、後なら1\n */\n public compareTo(other: DateTime): -1 | 0 | 1 {\n return Math.sign(this.toMillis() - other.toMillis()) as -1 | 0 | 1;\n }\n\n /**\n * 同じ時刻か判定する\n *\n * @param {DateTime} other\n * @returns {boolean}\n */\n public eq(other: DateTime): boolean {\n return this.compareTo(other) === 0;\n }\n\n /**\n * 自身が前の時刻か判定する\n *\n * @param {DateTime} other\n * @returns {boolean}\n */\n public lt(other: DateTime): boolean {\n return this.compareTo(other) < 0;\n }\n\n /**\n * 自身が前か同じ時刻か判定する\n *\n * @param {DateTime} other\n * @returns {boolean}\n */\n public lte(other: DateTime): boolean {\n return this.compareTo(other) <= 0;\n }\n\n /**\n * 自身が後の時刻か判定する\n *\n * @param {DateTime} other\n * @returns {boolean}\n */\n public gt(other: DateTime): boolean {\n return 0 < this.compareTo(other);\n }\n\n /**\n * 自身が後か同じ時刻か判定する\n *\n * @param {DateTime} other\n * @returns {boolean}\n */\n public gte(other: DateTime): boolean {\n return 0 <= this.compareTo(other);\n }\n\n /**\n * 自身のタイムゾーンで、指定した書式の文字列にする\n *\n * @param {string} outputFormat\n * @param {DateTimeFormatOptions} [options]\n * @returns {string}\n */\n public format(outputFormat: string, options?: DateTimeFormatOptions): string {\n return this.dateTime.toFormat(outputFormat, { locale: options?.locale ?? DEFAULT_LOCALE });\n }\n\n /**\n * 自身のタイムゾーンで、ISO形式の文字列にする\n *\n * @returns {string}\n */\n public toISO(): string {\n return this.dateTime.toISO() as string;\n }\n\n /**\n * Date に変換する\n *\n * @returns {Date}\n */\n public toDate(): Date {\n return this.dateTime.toJSDate();\n }\n\n /**\n * epoch ミリ秒に変換する\n *\n * @returns {number}\n */\n public toMillis(): number {\n return this.dateTime.toMillis();\n }\n\n /**\n * 自身のタイムゾーンで、ISO形式の文字列にする\n *\n * @returns {string}\n */\n public toString(): string {\n return this.toISO();\n }\n}\n"],"names":["DEFAULT_TIMEZONE","DEFAULT_LOCALE","assertZone","d","assertField","name","value","min","max","DateTime","dateTime","timezone","LuxonDateTime","options","zone","locale","formats","format","parsed","duration","unit","fields","daysInMonth","other","dateUnit","target","outputFormat"],"mappings":"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"}
|
package/lib/date-time.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"date-time.js","sources":["../src/date-time.ts"],"sourcesContent":["/**\n * このクラス DateTime の役割は、日時演算の実体としての luxon を内部に閉じ込め、利用者側に露出させないことにある\n */\nimport { DateTime as LuxonDateTime } from 'luxon';\nimport type { DateInput, DateUnit, Duration, ParseDateOptions, TimeUnit } from './date-util';\n\n/** set で変更する日時の要素。month は1〜12 */\nexport interface DateTimeFields {\n year?: number;\n month?: number;\n day?: number;\n hour?: number;\n minute?: number;\n second?: number;\n millisecond?: number;\n}\n\n/**\n * 日時を文字列にするときのオプション\n */\nexport interface DateTimeFormatOptions {\n /** 月名・曜日名に使うロケール。既定は 'en-US' */\n locale?: string;\n}\n\nconst DEFAULT_TIMEZONE = 'UTC';\n\nconst DEFAULT_LOCALE = 'en-US';\n\n/**\n * タイムゾーンの指定が不正な場合は、日時の不正とは区別して例外にする\n */\nconst assertZone = (d: LuxonDateTime): void => {\n if (!d.isValid && d.invalidReason === 'unsupported zone') {\n throw new RangeError(d.invalidExplanation ?? d.invalidReason);\n }\n};\n\n/**\n * set に渡された要素が min〜max の整数であることを確かめる\n */\nconst assertField = (name: keyof DateTimeFields, value: number | undefined, min: number, max: number): void => {\n if (value === undefined) {\n return;\n }\n if (!Number.isInteger(value) || value < min || max < value) {\n throw new RangeError(`${name} must be an integer from ${min} to ${max}: ${value}`);\n }\n};\n\n/**\n * 日時を表す不変オブジェクト\n * 演算メソッドは自身を変更せず、結果を新しいインスタンスで返す\n * インスタンスごとにタイムゾーンを持ち、startOf / endOf / set や各要素の参照はそのタイムゾーンで計算する\n */\nexport class DateTime {\n /**\n * 日時演算インスタンス\n */\n private dateTime: LuxonDateTime;\n\n private constructor(dateTime: LuxonDateTime) {\n this.dateTime = dateTime;\n }\n\n /**\n * 現在時刻を返す\n * タイムゾーンの指定が不正な場合は RangeError をスローする\n *\n * @param {string} [timezone] IANA名。既定は 'UTC'\n * @returns {DateTime}\n */\n public static now(timezone: string = DEFAULT_TIMEZONE): DateTime {\n const d = LuxonDateTime.now().setZone(timezone);\n assertZone(d);\n return new DateTime(d);\n }\n\n /**\n * 値を日時として解釈する\n * 生成したインスタンスは inputTimezone のタイムゾーンを持つ\n * DateTime を渡した場合、inputTimezone を省略すると渡した DateTime のタイムゾーンを引き継ぐ\n * duration / startOf / endOf はそのタイムゾーンで計算する\n * 解釈できない値、null / undefined / 空文字は null を返す。タイムゾーンの指定が不正な場合は RangeError をスローする\n *\n * @param {DateInput} value\n * @param {ParseDateOptions} [options]\n * @returns {DateTime | null}\n */\n public static parse(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: LuxonDateTime | null = null;\n if (value instanceof DateTime) {\n d = options?.inputTimezone ? value.dateTime.setZone(options.inputTimezone) : value.dateTime;\n } else if (value instanceof Date) {\n d = LuxonDateTime.fromJSDate(value, { zone: zone });\n } else if (typeof value === 'number') {\n d = Number.isFinite(value) ? LuxonDateTime.fromMillis(value, { zone: zone }) : null;\n } else {\n const locale = options?.locale ?? DEFAULT_LOCALE;\n const formats = options?.inputFormat ? [options.inputFormat].flat() : [];\n for (const format of formats) {\n const parsed = LuxonDateTime.fromFormat(value, format, {\n zone: zone,\n locale: locale\n });\n assertZone(parsed);\n if (parsed.isValid) {\n d = parsed;\n break;\n }\n }\n if (d == null) {\n d = LuxonDateTime.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 new DateTime(d);\n }\n\n /** 年 */\n public get year(): number {\n return this.dateTime.year;\n }\n\n /** 月(1〜12) */\n public get month(): number {\n return this.dateTime.month;\n }\n\n /** 日 */\n public get day(): number {\n return this.dateTime.day;\n }\n\n /** 時 */\n public get hour(): number {\n return this.dateTime.hour;\n }\n\n /** 分 */\n public get minute(): number {\n return this.dateTime.minute;\n }\n\n /** 秒 */\n public get second(): number {\n return this.dateTime.second;\n }\n\n /** ミリ秒 */\n public get millisecond(): number {\n return this.dateTime.millisecond;\n }\n\n /** 曜日。月曜が1、日曜が7 */\n public get weekday(): number {\n return this.dateTime.weekday;\n }\n\n /** その月の日数 */\n public get daysInMonth(): number {\n return this.dateTime.daysInMonth as number;\n }\n\n /** 夏時間の期間中か */\n public get isInDST(): boolean {\n return this.dateTime.isInDST;\n }\n\n /** タイムゾーン(IANA名) */\n public get timezone(): string {\n return this.dateTime.zoneName as string;\n }\n\n /**\n * 期間を加算した結果を返す\n * 負の値を指定すると減算になる\n *\n * @param {Duration} duration\n * @returns {DateTime}\n */\n public plus(duration: Duration): DateTime {\n return new DateTime(this.dateTime.plus(duration));\n }\n\n /**\n * 期間を減算した結果を返す\n *\n * @param {Duration} duration\n * @returns {DateTime}\n */\n public minus(duration: Duration): DateTime {\n return new DateTime(this.dateTime.minus(duration));\n }\n\n /**\n * 指定した単位の最初の時点に切り捨てた結果を返す(month なら月初の00:00:00.000)\n * week は月曜始まりで切り捨てる\n *\n * @param {DateUnit} unit\n * @returns {DateTime}\n */\n public startOf(unit: DateUnit): DateTime {\n return new DateTime(this.dateTime.startOf(unit));\n }\n\n /**\n * 指定した単位の最後の時点に切り上げた結果を返す(month なら月末の23:59:59.999)\n * week は日曜終わりで切り上げる\n *\n * @param {DateUnit} unit\n * @returns {DateTime}\n */\n public endOf(unit: DateUnit): DateTime {\n return new DateTime(this.dateTime.endOf(unit));\n }\n\n /**\n * 指定した要素を変更した結果を返す\n * 範囲外の値や整数でない値を指定した場合は RangeError をスローする\n * day を指定せずに year / month を変更し、日がその月に無い場合は月末日にする(1月31日に { month: 2 } なら2月末日)\n *\n * @param {DateTimeFields} fields\n * @returns {DateTime}\n */\n public set(fields: DateTimeFields): DateTime {\n assertField('month', fields.month, 1, 12);\n assertField('hour', fields.hour, 0, 23);\n assertField('minute', fields.minute, 0, 59);\n assertField('second', fields.second, 0, 59);\n assertField('millisecond', fields.millisecond, 0, 999);\n // day の上限は変更後の年月で決まる\n const daysInMonth = this.dateTime.set({\n year: fields.year ?? this.year,\n month: fields.month ?? this.month,\n day: 1\n }).daysInMonth as number;\n assertField('day', fields.day, 1, daysInMonth);\n return new DateTime(this.dateTime.set(fields));\n }\n\n /**\n * 同じ時刻を別のタイムゾーンで表した結果を返す\n * タイムゾーンの指定が不正な場合は RangeError をスローする\n *\n * @param {string} timezone IANA名\n * @returns {DateTime}\n */\n public setZone(timezone: string): DateTime {\n const d = this.dateTime.setZone(timezone);\n assertZone(d);\n return new DateTime(d);\n }\n\n /**\n * 自身 − other を unit の単位で返す\n * 両方を自身のタイムゾーンで unit の始まりに切り捨ててから差を取るため、暦の上での差になる(23:00 と翌 01:00 の days は 1)\n *\n * @param {DateTime} other\n * @param {TimeUnit} unit\n * @returns {number}\n */\n public diff(other: DateTime, unit: TimeUnit): number {\n // 'days' → 'day' のように切り捨ての単位にする\n const dateUnit = unit.slice(0, -1) as DateUnit;\n const target = other.dateTime.setZone(this.dateTime.zone);\n return this.dateTime.startOf(dateUnit).diff(target.startOf(dateUnit), unit).get(unit);\n }\n\n /**\n * 時刻を比較する。タイムゾーンが異なっていても同じ時刻なら等しい\n *\n * @param {DateTime} other\n * @returns {-1 | 0 | 1} 自身が前なら-1、等しければ0、後なら1\n */\n public compareTo(other: DateTime): -1 | 0 | 1 {\n return Math.sign(this.toMillis() - other.toMillis()) as -1 | 0 | 1;\n }\n\n /**\n * 同じ時刻か判定する\n *\n * @param {DateTime} other\n * @returns {boolean}\n */\n public eq(other: DateTime): boolean {\n return this.compareTo(other) === 0;\n }\n\n /**\n * 自身が前の時刻か判定する\n *\n * @param {DateTime} other\n * @returns {boolean}\n */\n public lt(other: DateTime): boolean {\n return this.compareTo(other) < 0;\n }\n\n /**\n * 自身が前か同じ時刻か判定する\n *\n * @param {DateTime} other\n * @returns {boolean}\n */\n public lte(other: DateTime): boolean {\n return this.compareTo(other) <= 0;\n }\n\n /**\n * 自身が後の時刻か判定する\n *\n * @param {DateTime} other\n * @returns {boolean}\n */\n public gt(other: DateTime): boolean {\n return 0 < this.compareTo(other);\n }\n\n /**\n * 自身が後か同じ時刻か判定する\n *\n * @param {DateTime} other\n * @returns {boolean}\n */\n public gte(other: DateTime): boolean {\n return 0 <= this.compareTo(other);\n }\n\n /**\n * 自身のタイムゾーンで、指定した書式の文字列にする\n *\n * @param {string} outputFormat\n * @param {DateTimeFormatOptions} [options]\n * @returns {string}\n */\n public format(outputFormat: string, options?: DateTimeFormatOptions): string {\n return this.dateTime.toFormat(outputFormat, { locale: options?.locale ?? DEFAULT_LOCALE });\n }\n\n /**\n * 自身のタイムゾーンで、ISO形式の文字列にする\n *\n * @returns {string}\n */\n public toISO(): string {\n return this.dateTime.toISO() as string;\n }\n\n /**\n * Date に変換する\n *\n * @returns {Date}\n */\n public toDate(): Date {\n return this.dateTime.toJSDate();\n }\n\n /**\n * epoch ミリ秒に変換する\n *\n * @returns {number}\n */\n public toMillis(): number {\n return this.dateTime.toMillis();\n }\n\n /**\n * 自身のタイムゾーンで、ISO形式の文字列にする\n *\n * @returns {string}\n */\n public toString(): string {\n return this.toISO();\n }\n}\n"],"names":["DEFAULT_TIMEZONE","DEFAULT_LOCALE","assertZone","d","assertField","name","value","min","max","DateTime","dateTime","timezone","LuxonDateTime","options","zone","locale","formats","format","parsed","duration","unit","fields","daysInMonth","other","dateUnit","target","outputFormat"],"mappings":"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"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
"use strict";const i=require("./date-time.cjs"),c="UTC",_="yyyy-MM-dd'T'HH:mm:ss.SSSZZ",I=25569,O=1440*60*1e3,P=3600*1e3,b=/GMT[+-]\d{1,2}(:\d{2})?/g,B={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"}},d=(a,t,e,r)=>{const n=i.DateTime.parse(a,e),s=i.DateTime.parse(t,e);return!n||!s?!1:r(n.toMillis(),s.toMillis())};function u(a,t){return i.DateTime.parse(a,t)?.toDate()??null}function o(a,t){if(typeof a=="object"&&a!==null&&!(a instanceof Date)&&!(a instanceof i.DateTime))return o(new Date,a);if(a==null||a==="")return"";const e=i.DateTime.parse(a,t);if(!e)return t?.invalidText??"Invalid Date";const r=e.setZone(t?.outputTimezone??c);return t?.outputFormat?r.format(t.outputFormat,{locale:t.locale}):r.toISO()}function l(a,t){return i.DateTime.parse(a,t)!=null}function f(a,t,e){return d(a,t,e,(r,n)=>r===n)}function m(a,t,e){return d(a,t,e,(r,n)=>r<n)}function S(a,t,e){return d(a,t,e,(r,n)=>r<=n)}function D(a,t,e){return d(a,t,e,(r,n)=>n<r)}function A(a,t,e){return d(a,t,e,(r,n)=>n<=r)}function E(a,t){const e=i.DateTime.parse(a,t)?.startOf("day");if(!e)return!1;const r=i.DateTime.now(e.timezone).startOf("day");return e.lt(r)}function y(a,t){const e=i.DateTime.parse(a,t);return e!=null&&e.toMillis()<Date.now()}function g(a,t,e,r){const n=i.DateTime.parse(a,r),s=i.DateTime.parse(t,r);return!n||!s?NaN:n.diff(s,e)}function p(a=c){return i.DateTime.now(a).format(_)}function C(a,t){let e=(a-I)*O;return t?.offset&&(e-=t.offset*P),e}function M(a,t){return(t===void 0?i.DateTime.now(a):i.DateTime.parse(t)?.setZone(a))?.isInDST??!1}function T(a,t){const e={...B,...t?.abbreviations}[a];return e?e.daylight&&i.DateTime.parse(t?.at??new Date)?.setZone(a)?.isInDST?e.daylight:e.standard:null}function h(a,t,e){const r=T(t,e);return r==null?a:a.replace(b,r)}const L=Object.freeze(Object.defineProperty({__proto__:null,applyTimezoneAbbr:h,convertExcelDateSerialToUnixTimeSerial:C,currentTimestamp:p,diff:g,formatDate:o,getTimezoneAbbr:T,isAfter:D,isBefore:m,isInDST:M,isPastDate:E,isPastDateTime:y,isSame:f,isSameOrAfter:A,isSameOrBefore:S,isValid:l,parseDate:u},Symbol.toStringTag,{value:"Module"}));exports.applyTimezoneAbbr=h;exports.convertExcelDateSerialToUnixTimeSerial=C;exports.currentTimestamp=p;exports.dateUtil=L;exports.diff=g;exports.formatDate=o;exports.getTimezoneAbbr=T;exports.isAfter=D;exports.isBefore=m;exports.isInDST=M;exports.isPastDate=E;exports.isPastDateTime=y;exports.isSame=f;exports.isSameOrAfter=A;exports.isSameOrBefore=S;exports.isValid=l;exports.parseDate=u;
|
|
2
|
-
//# sourceMappingURL=date-util-ByW86YIS.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"date-util-ByW86YIS.cjs","sources":["../src/date-util.ts"],"sourcesContent":["import { DateTime } from './date-time';\n\n/**\n * 日時として解釈する値。string はISO形式または inputFormat の書式、number は epoch ミリ秒\n * DateTime は inputTimezone を省略した場合、その DateTime のタイムゾーンで扱う\n */\nexport type DateInput = string | Date | number | DateTime | 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 /** 書式の月名・曜日名を解釈・出力するときのロケール。既定は 'en-US' */\n locale?: string;\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\nconst compare = (date1: DateInput, date2: DateInput, options: ParseDateOptions | undefined, predicate: (v1: number, v2: number) => boolean): boolean => {\n const d1 = DateTime.parse(date1, options);\n const d2 = DateTime.parse(date2, options);\n if (!d1 || !d2) {\n return false;\n }\n return predicate(d1.toMillis(), d2.toMillis());\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 DateTime.parse(value, options)?.toDate() ?? 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) && !(value instanceof DateTime)) {\n return formatDate(new Date(), value);\n }\n if (value == null || value === '') {\n return '';\n }\n const d = DateTime.parse(value, options);\n if (!d) {\n return options?.invalidText ?? 'Invalid Date';\n }\n const output = d.setZone(options?.outputTimezone ?? DEFAULT_TIMEZONE);\n return options?.outputFormat ? output.format(options.outputFormat, { locale: options.locale }) : output.toISO();\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 DateTime.parse(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 = DateTime.parse(value, options)?.startOf('day');\n if (!target) {\n return false;\n }\n const today = DateTime.now(target.timezone).startOf('day');\n return target.lt(today);\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 = DateTime.parse(value, options);\n return target != null && target.toMillis() < 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 = DateTime.parse(date1, options);\n const d2 = DateTime.parse(date2, options);\n if (!d1 || !d2) {\n return NaN;\n }\n return d1.diff(d2, 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 return DateTime.now(timezone).format(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 * 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(timezone) : DateTime.parse(at)?.setZone(timezone);\n return d?.isInDST ?? false;\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.parse(options?.at ?? new Date())?.setZone(timezone);\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","compare","date1","date2","options","predicate","d1","DateTime","d2","parseDate","value","formatDate","d","output","isValid","isSame","v1","v2","isBefore","isSameOrBefore","isAfter","isSameOrAfter","isPastDate","target","today","isPastDateTime","diff","unit","currentTimestamp","timezone","convertExcelDateSerialToUnixTimeSerial","excelDateSerial","timeserial","isInDST","at","getTimezoneAbbr","definition","applyTimezoneAbbr","text","abbr"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"date-util-C581gVKx.js","sources":["../src/date-util.ts"],"sourcesContent":["import { DateTime } from './date-time';\n\n/**\n * 日時として解釈する値。string はISO形式または inputFormat の書式、number は epoch ミリ秒\n * DateTime は inputTimezone を省略した場合、その DateTime のタイムゾーンで扱う\n */\nexport type DateInput = string | Date | number | DateTime | 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 /** 書式の月名・曜日名を解釈・出力するときのロケール。既定は 'en-US' */\n locale?: string;\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\nconst compare = (date1: DateInput, date2: DateInput, options: ParseDateOptions | undefined, predicate: (v1: number, v2: number) => boolean): boolean => {\n const d1 = DateTime.parse(date1, options);\n const d2 = DateTime.parse(date2, options);\n if (!d1 || !d2) {\n return false;\n }\n return predicate(d1.toMillis(), d2.toMillis());\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 DateTime.parse(value, options)?.toDate() ?? 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) && !(value instanceof DateTime)) {\n return formatDate(new Date(), value);\n }\n if (value == null || value === '') {\n return '';\n }\n const d = DateTime.parse(value, options);\n if (!d) {\n return options?.invalidText ?? 'Invalid Date';\n }\n const output = d.setZone(options?.outputTimezone ?? DEFAULT_TIMEZONE);\n return options?.outputFormat ? output.format(options.outputFormat, { locale: options.locale }) : output.toISO();\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 DateTime.parse(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 = DateTime.parse(value, options)?.startOf('day');\n if (!target) {\n return false;\n }\n const today = DateTime.now(target.timezone).startOf('day');\n return target.lt(today);\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 = DateTime.parse(value, options);\n return target != null && target.toMillis() < 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 = DateTime.parse(date1, options);\n const d2 = DateTime.parse(date2, options);\n if (!d1 || !d2) {\n return NaN;\n }\n return d1.diff(d2, 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 return DateTime.now(timezone).format(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 * 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(timezone) : DateTime.parse(at)?.setZone(timezone);\n return d?.isInDST ?? false;\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.parse(options?.at ?? new Date())?.setZone(timezone);\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","compare","date1","date2","options","predicate","d1","DateTime","d2","parseDate","value","formatDate","d","output","isValid","isSame","v1","v2","isBefore","isSameOrBefore","isAfter","isSameOrAfter","isPastDate","target","today","isPastDateTime","diff","unit","currentTimestamp","timezone","convertExcelDateSerialToUnixTimeSerial","excelDateSerial","timeserial","isInDST","at","getTimezoneAbbr","definition","applyTimezoneAbbr","text","abbr"],"mappings":"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"}
|