@cloudcome/utils-core 1.8.0 → 1.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/dist/async.cjs +96 -136
- package/dist/async.cjs.map +1 -1
- package/dist/async.mjs +96 -136
- package/dist/async.mjs.map +1 -1
- package/dist/cache.cjs +1 -7
- package/dist/cache.cjs.map +1 -1
- package/dist/cache.mjs +1 -7
- package/dist/cache.mjs.map +1 -1
- package/dist/core.cjs +51 -71
- package/dist/core.cjs.map +1 -1
- package/dist/core.mjs +51 -71
- package/dist/core.mjs.map +1 -1
- package/dist/emitter.cjs +19 -32
- package/dist/emitter.cjs.map +1 -1
- package/dist/emitter.mjs +19 -32
- package/dist/emitter.mjs.map +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.mjs +1 -1
- package/dist/timer.cjs +4 -4
- package/dist/timer.cjs.map +1 -1
- package/dist/timer.mjs +4 -4
- package/dist/timer.mjs.map +1 -1
- package/dist/types.d.ts +27 -0
- package/dist/url.cjs +9 -9
- package/dist/url.cjs.map +1 -1
- package/dist/url.mjs +9 -9
- package/dist/url.mjs.map +1 -1
- package/package.json +1 -1
package/dist/core.cjs
CHANGED
|
@@ -1,30 +1,20 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __typeError = (msg) => {
|
|
3
|
-
throw TypeError(msg);
|
|
4
|
-
};
|
|
5
|
-
var __accessCheck = (obj, member, msg) => member.has(obj) || __typeError("Cannot " + msg);
|
|
6
|
-
var __privateGet = (obj, member, getter) => (__accessCheck(obj, member, "read from private field"), getter ? getter.call(obj) : member.get(obj));
|
|
7
|
-
var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
|
|
8
|
-
var __privateSet = (obj, member, value, setter) => (__accessCheck(obj, member, "write to private field"), setter ? setter.call(obj, value) : member.set(obj, value), value);
|
|
9
|
-
var __privateMethod = (obj, member, method) => (__accessCheck(obj, member, "access private method"), method);
|
|
10
|
-
var _timestamp, _targetDate, _utcDate, _localTZOffset, _localTzOffsetMS, _targetTzOffset, _targetTzOffsetMS, _options, _TzDate_instances, updateTimestamp_fn;
|
|
11
2
|
const type = require("./type.cjs");
|
|
12
3
|
const TZ_OFFSET_MS = 60 * 1e3;
|
|
13
|
-
|
|
4
|
+
class TzDate {
|
|
5
|
+
#timestamp;
|
|
6
|
+
#targetDate;
|
|
7
|
+
#utcDate;
|
|
8
|
+
#localTZOffset = TzDate.getOffset();
|
|
9
|
+
#localTzOffsetMS = this.#localTZOffset * TZ_OFFSET_MS;
|
|
10
|
+
#targetTzOffset = 0;
|
|
11
|
+
#targetTzOffsetMS = 0;
|
|
12
|
+
#options;
|
|
14
13
|
constructor(options) {
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
__privateAdd(this, _localTZOffset, _TzDate.getOffset());
|
|
20
|
-
__privateAdd(this, _localTzOffsetMS, __privateGet(this, _localTZOffset) * TZ_OFFSET_MS);
|
|
21
|
-
__privateAdd(this, _targetTzOffset, 0);
|
|
22
|
-
__privateAdd(this, _targetTzOffsetMS, 0);
|
|
23
|
-
__privateAdd(this, _options);
|
|
24
|
-
__privateSet(this, _options, (options instanceof _TzDate ? __privateGet(options, _options) : options) || {});
|
|
25
|
-
const { offset, timestamp, value } = __privateGet(this, _options);
|
|
26
|
-
__privateSet(this, _targetTzOffset, type.isNumber(offset) ? offset : __privateGet(this, _localTZOffset));
|
|
27
|
-
__privateSet(this, _targetTzOffsetMS, __privateGet(this, _targetTzOffset) * TZ_OFFSET_MS);
|
|
14
|
+
this.#options = (options instanceof TzDate ? options.#options : options) || {};
|
|
15
|
+
const { offset, timestamp, value } = this.#options;
|
|
16
|
+
this.#targetTzOffset = type.isNumber(offset) ? offset : this.#localTZOffset;
|
|
17
|
+
this.#targetTzOffsetMS = this.#targetTzOffset * TZ_OFFSET_MS;
|
|
28
18
|
if (Array.isArray(value) && value.length > 0) {
|
|
29
19
|
const [fullYear, month, day, hours, minutes, seconds, milliseconds] = value;
|
|
30
20
|
const timestamp2 = Date.UTC(
|
|
@@ -36,92 +26,96 @@ const _TzDate = class _TzDate {
|
|
|
36
26
|
seconds ?? 0,
|
|
37
27
|
milliseconds ?? 0
|
|
38
28
|
);
|
|
39
|
-
|
|
29
|
+
this.#timestamp = timestamp2 + this.#targetTzOffsetMS;
|
|
40
30
|
} else {
|
|
41
|
-
|
|
31
|
+
this.#timestamp = timestamp || Date.now();
|
|
42
32
|
}
|
|
43
|
-
|
|
44
|
-
|
|
33
|
+
this.#targetDate = new Date(this.#timestamp + this.#localTzOffsetMS - this.#targetTzOffsetMS);
|
|
34
|
+
this.#utcDate = new Date(this.#timestamp + this.#localTzOffsetMS);
|
|
35
|
+
}
|
|
36
|
+
#updateTimestamp() {
|
|
37
|
+
this.#timestamp = this.#targetDate.getTime() + this.#targetTzOffsetMS - this.#localTzOffsetMS;
|
|
38
|
+
this.#utcDate = new Date(this.#timestamp + this.#localTzOffsetMS);
|
|
45
39
|
}
|
|
46
40
|
getTimezoneOffset() {
|
|
47
|
-
return
|
|
41
|
+
return this.#targetTzOffset;
|
|
48
42
|
}
|
|
49
43
|
getTimezoneOrder() {
|
|
50
|
-
return
|
|
44
|
+
return TzDate.getOrder(this.#targetTzOffset);
|
|
51
45
|
}
|
|
52
46
|
getFullYear() {
|
|
53
|
-
return
|
|
47
|
+
return this.#targetDate.getFullYear();
|
|
54
48
|
}
|
|
55
49
|
getMonth() {
|
|
56
|
-
return
|
|
50
|
+
return this.#targetDate.getMonth();
|
|
57
51
|
}
|
|
58
52
|
getDate() {
|
|
59
|
-
return
|
|
53
|
+
return this.#targetDate.getDate();
|
|
60
54
|
}
|
|
61
55
|
getHours() {
|
|
62
|
-
return
|
|
56
|
+
return this.#targetDate.getHours();
|
|
63
57
|
}
|
|
64
58
|
getMinutes() {
|
|
65
|
-
return
|
|
59
|
+
return this.#targetDate.getMinutes();
|
|
66
60
|
}
|
|
67
61
|
getSeconds() {
|
|
68
|
-
return
|
|
62
|
+
return this.#targetDate.getSeconds();
|
|
69
63
|
}
|
|
70
64
|
getMilliseconds() {
|
|
71
|
-
return
|
|
65
|
+
return this.#targetDate.getMilliseconds();
|
|
72
66
|
}
|
|
73
67
|
setFullYear(year, month, date) {
|
|
74
|
-
|
|
75
|
-
|
|
68
|
+
this.#targetDate.setFullYear(year);
|
|
69
|
+
this.#updateTimestamp();
|
|
76
70
|
if (type.isNumber(month)) this.setMonth(month);
|
|
77
71
|
if (type.isNumber(date)) this.setDate(date);
|
|
78
72
|
return this.getTime();
|
|
79
73
|
}
|
|
80
74
|
setMonth(month, date) {
|
|
81
|
-
|
|
82
|
-
|
|
75
|
+
this.#targetDate.setMonth(month);
|
|
76
|
+
this.#updateTimestamp();
|
|
83
77
|
if (type.isNumber(date)) this.setDate(date);
|
|
84
78
|
return this.getTime();
|
|
85
79
|
}
|
|
86
80
|
setDate(date) {
|
|
87
|
-
|
|
88
|
-
|
|
81
|
+
this.#targetDate.setDate(date);
|
|
82
|
+
this.#updateTimestamp();
|
|
89
83
|
return this.getTime();
|
|
90
84
|
}
|
|
91
85
|
setHours(hours, minutes, seconds, milliseconds) {
|
|
92
|
-
|
|
93
|
-
|
|
86
|
+
this.#targetDate.setHours(hours);
|
|
87
|
+
this.#updateTimestamp();
|
|
94
88
|
if (type.isNumber(minutes)) this.setMinutes(minutes);
|
|
95
89
|
if (type.isNumber(seconds)) this.setSeconds(seconds);
|
|
96
90
|
if (type.isNumber(milliseconds)) this.setMilliseconds(milliseconds);
|
|
97
91
|
return this.getTime();
|
|
98
92
|
}
|
|
99
93
|
setMinutes(minutes, seconds, milliseconds) {
|
|
100
|
-
|
|
101
|
-
|
|
94
|
+
this.#targetDate.setMinutes(minutes);
|
|
95
|
+
this.#updateTimestamp();
|
|
102
96
|
if (type.isNumber(seconds)) this.setSeconds(seconds);
|
|
103
97
|
if (type.isNumber(milliseconds)) this.setMilliseconds(milliseconds);
|
|
104
98
|
return this.getTime();
|
|
105
99
|
}
|
|
106
100
|
setSeconds(seconds, milliseconds) {
|
|
107
|
-
|
|
108
|
-
|
|
101
|
+
this.#targetDate.setSeconds(seconds);
|
|
102
|
+
this.#updateTimestamp();
|
|
109
103
|
if (type.isNumber(milliseconds)) this.setMilliseconds(milliseconds);
|
|
110
104
|
return this.getTime();
|
|
111
105
|
}
|
|
112
106
|
setMilliseconds(milliseconds) {
|
|
113
|
-
|
|
114
|
-
|
|
107
|
+
this.#targetDate.setMilliseconds(milliseconds);
|
|
108
|
+
this.#updateTimestamp();
|
|
115
109
|
return this.getTime();
|
|
116
110
|
}
|
|
117
111
|
getTime() {
|
|
118
|
-
return
|
|
112
|
+
return this.#timestamp;
|
|
119
113
|
}
|
|
120
114
|
getDay() {
|
|
121
|
-
return
|
|
115
|
+
return this.#targetDate.getDay();
|
|
122
116
|
}
|
|
123
117
|
toISOString() {
|
|
124
|
-
return dateFormat(
|
|
118
|
+
return dateFormat(this.#utcDate, "YYYY-MM-DDTHH:mm:ss.SSSZ");
|
|
125
119
|
}
|
|
126
120
|
/**
|
|
127
121
|
* 创建一个 TzDate 对象
|
|
@@ -133,8 +127,8 @@ const _TzDate = class _TzDate {
|
|
|
133
127
|
* const tzDate = TzDate.from(new TzDate());
|
|
134
128
|
* ```
|
|
135
129
|
*/
|
|
136
|
-
static from(td, offset =
|
|
137
|
-
return new
|
|
130
|
+
static from(td, offset = TzDate.getOffset()) {
|
|
131
|
+
return new TzDate({
|
|
138
132
|
offset,
|
|
139
133
|
timestamp: td.getTime()
|
|
140
134
|
});
|
|
@@ -143,7 +137,7 @@ const _TzDate = class _TzDate {
|
|
|
143
137
|
* 获取时区序号
|
|
144
138
|
* @param offset - 默认使用当前时区分钟偏移量
|
|
145
139
|
*/
|
|
146
|
-
static getOrder(offset =
|
|
140
|
+
static getOrder(offset = TzDate.getOffset()) {
|
|
147
141
|
return offset / -60;
|
|
148
142
|
}
|
|
149
143
|
/**
|
|
@@ -153,21 +147,7 @@ const _TzDate = class _TzDate {
|
|
|
153
147
|
static getOffset(gmtOrder) {
|
|
154
148
|
return type.isNumber(gmtOrder) ? gmtOrder * -60 : (/* @__PURE__ */ new Date()).getTimezoneOffset();
|
|
155
149
|
}
|
|
156
|
-
}
|
|
157
|
-
_timestamp = new WeakMap();
|
|
158
|
-
_targetDate = new WeakMap();
|
|
159
|
-
_utcDate = new WeakMap();
|
|
160
|
-
_localTZOffset = new WeakMap();
|
|
161
|
-
_localTzOffsetMS = new WeakMap();
|
|
162
|
-
_targetTzOffset = new WeakMap();
|
|
163
|
-
_targetTzOffsetMS = new WeakMap();
|
|
164
|
-
_options = new WeakMap();
|
|
165
|
-
_TzDate_instances = new WeakSet();
|
|
166
|
-
updateTimestamp_fn = function() {
|
|
167
|
-
__privateSet(this, _timestamp, __privateGet(this, _targetDate).getTime() + __privateGet(this, _targetTzOffsetMS) - __privateGet(this, _localTzOffsetMS));
|
|
168
|
-
__privateSet(this, _utcDate, new Date(__privateGet(this, _timestamp) + __privateGet(this, _localTzOffsetMS)));
|
|
169
|
-
};
|
|
170
|
-
let TzDate = _TzDate;
|
|
150
|
+
}
|
|
171
151
|
function isValidDate(unknown) {
|
|
172
152
|
return unknown instanceof Date && !Number.isNaN(unknown.getTime()) || unknown instanceof TzDate && !Number.isNaN(unknown.getTime());
|
|
173
153
|
}
|
package/dist/core.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"core.cjs","sources":["../src/date/timezone.ts","../src/date/core.ts"],"sourcesContent":["import { isNumber } from '../type';\nimport { dateFormat } from './core';\n\nexport type TzDateOptions = {\n /**\n * 时间戳\n * @default Date.now()\n */\n timestamp?: number;\n\n /**\n * 日期值\n */\n value?: readonly [\n year?: number,\n month?: number,\n day?: number,\n hours?: number,\n minutes?: number,\n seconds?: number,\n milliseconds?: number,\n ];\n\n /**\n * 时区偏移量,单位为分钟,默认为当前时区\n */\n offset?: number;\n};\n\nconst TZ_OFFSET_MS = 60 * 1000;\n\nexport class TzDate {\n #timestamp: number;\n #targetDate: Date;\n #utcDate: Date;\n\n #localTZOffset = TzDate.getOffset();\n #localTzOffsetMS = this.#localTZOffset * TZ_OFFSET_MS;\n\n #targetTzOffset = 0;\n #targetTzOffsetMS = 0;\n\n #options: TzDateOptions;\n\n constructor(options?: TzDateOptions | TzDate) {\n this.#options = (options instanceof TzDate ? options.#options : options) || {};\n const { offset, timestamp, value } = this.#options;\n this.#targetTzOffset = isNumber(offset) ? offset : this.#localTZOffset;\n this.#targetTzOffsetMS = this.#targetTzOffset * TZ_OFFSET_MS;\n\n if (Array.isArray(value) && value.length > 0) {\n const [fullYear, month, day, hours, minutes, seconds, milliseconds] = value;\n const timestamp = Date.UTC(\n fullYear ?? 0,\n month ?? 0,\n day ?? 1,\n hours ?? 0,\n minutes ?? 0,\n seconds ?? 0,\n milliseconds ?? 0,\n );\n\n this.#timestamp = timestamp + this.#targetTzOffsetMS;\n } else {\n this.#timestamp = timestamp || Date.now();\n }\n\n this.#targetDate = new Date(this.#timestamp + this.#localTzOffsetMS - this.#targetTzOffsetMS);\n this.#utcDate = new Date(this.#timestamp + this.#localTzOffsetMS);\n }\n\n #updateTimestamp() {\n this.#timestamp = this.#targetDate.getTime() + this.#targetTzOffsetMS - this.#localTzOffsetMS;\n this.#utcDate = new Date(this.#timestamp + this.#localTzOffsetMS);\n }\n\n getTimezoneOffset() {\n return this.#targetTzOffset;\n }\n\n getTimezoneOrder() {\n return TzDate.getOrder(this.#targetTzOffset);\n }\n\n getFullYear() {\n return this.#targetDate.getFullYear();\n }\n\n getMonth() {\n return this.#targetDate.getMonth();\n }\n\n getDate() {\n return this.#targetDate.getDate();\n }\n\n getHours() {\n return this.#targetDate.getHours();\n }\n\n getMinutes() {\n return this.#targetDate.getMinutes();\n }\n\n getSeconds() {\n return this.#targetDate.getSeconds();\n }\n\n getMilliseconds() {\n return this.#targetDate.getMilliseconds();\n }\n\n setFullYear(year: number, month?: number, date?: number) {\n this.#targetDate.setFullYear(year);\n this.#updateTimestamp();\n\n if (isNumber(month)) this.setMonth(month);\n if (isNumber(date)) this.setDate(date);\n\n return this.getTime();\n }\n\n setMonth(month: number, date?: number) {\n this.#targetDate.setMonth(month);\n this.#updateTimestamp();\n\n if (isNumber(date)) this.setDate(date);\n\n return this.getTime();\n }\n\n setDate(date: number) {\n this.#targetDate.setDate(date);\n this.#updateTimestamp();\n\n return this.getTime();\n }\n\n setHours(hours: number, minutes?: number, seconds?: number, milliseconds?: number) {\n this.#targetDate.setHours(hours);\n this.#updateTimestamp();\n\n if (isNumber(minutes)) this.setMinutes(minutes);\n if (isNumber(seconds)) this.setSeconds(seconds);\n if (isNumber(milliseconds)) this.setMilliseconds(milliseconds);\n\n return this.getTime();\n }\n\n setMinutes(minutes: number, seconds?: number, milliseconds?: number) {\n this.#targetDate.setMinutes(minutes);\n this.#updateTimestamp();\n\n if (isNumber(seconds)) this.setSeconds(seconds);\n if (isNumber(milliseconds)) this.setMilliseconds(milliseconds);\n\n return this.getTime();\n }\n\n setSeconds(seconds: number, milliseconds?: number) {\n this.#targetDate.setSeconds(seconds);\n this.#updateTimestamp();\n\n if (isNumber(milliseconds)) this.setMilliseconds(milliseconds);\n\n return this.getTime();\n }\n\n setMilliseconds(milliseconds: number) {\n this.#targetDate.setMilliseconds(milliseconds);\n this.#updateTimestamp();\n\n return this.getTime();\n }\n\n getTime() {\n return this.#timestamp;\n }\n\n getDay() {\n return this.#targetDate.getDay();\n }\n\n toISOString() {\n return dateFormat(this.#utcDate, 'YYYY-MM-DDTHH:mm:ss.SSSZ');\n }\n\n /**\n * 创建一个 TzDate 对象\n * @param td - 需要转换的日期对象\n * @param offset - 目标时区分钟偏移量,默认为当前时区\n * @returns 返回一个 TzDate 对象\n * @example\n * ```js\n * const tzDate = TzDate.from(new TzDate());\n * ```\n */\n static from(td: TzDate, offset = TzDate.getOffset()) {\n return new TzDate({\n offset: offset,\n timestamp: td.getTime(),\n });\n }\n\n /**\n * 获取时区序号\n * @param offset - 默认使用当前时区分钟偏移量\n */\n static getOrder(offset = TzDate.getOffset()) {\n return offset / -60;\n }\n\n /**\n * 获取时区分钟偏移量\n * @param gmtOrder - 默认使用当前时区序号\n */\n static getOffset(gmtOrder?: number) {\n return isNumber(gmtOrder) ? gmtOrder * -60 : new Date().getTimezoneOffset();\n }\n}\n","import { objectEach } from '@/object';\nimport { isDate, isString } from '@/type';\nimport { TzDate } from './timezone';\n\n/**\n * 判断一个值是否为有效的日期对象\n * @param unknown - 需要判断的值\n * @returns 如果值是有效的日期对象则返回 true,否则返回 false\n * @example\n * ```typescript\n * isValidDate(new Date()); // true\n * isValidDate('2023-01-01'); // false\n * isValidDate(NaN); // false\n * ```\n */\nexport function isValidDate(unknown: unknown): unknown is Date | TzDate {\n return (\n (unknown instanceof Date && !Number.isNaN(unknown.getTime())) ||\n (unknown instanceof TzDate && !Number.isNaN(unknown.getTime()))\n );\n}\n\nexport type DateLike = Date | TzDate;\nexport type DateValue = number | string | DateLike;\n\nfunction _guessDateSeparator(value: DateValue): Date | undefined {\n if (!isString(value)) return;\n\n const value2 = value.replace(/-/g, '/');\n\n return new Date(value2);\n}\n\nfunction _guessDateTimezone(value: DateValue): Date | undefined {\n if (!isString(value)) return;\n\n const re = /([+-])(\\d\\d)(\\d\\d)$/;\n\n const matches = re.exec(value);\n\n if (!matches) return;\n\n const value2 = value.replace(re, 'Z');\n const d = new Date(value2);\n\n if (!isValidDate(d)) return;\n\n const [, flag, hours, minutes] = matches;\n const hours2 = Number.parseInt(hours, 10);\n const minutes2 = Number.parseInt(minutes, 10);\n const offset = (a: number, b: number): number => (flag === '+' ? a - b : a + b);\n\n d.setHours(offset(d.getHours(), hours2));\n d.setMinutes(offset(d.getMinutes(), minutes2));\n\n return d;\n}\n\n/**\n * 解析为Date对象\n * @param dateValue - 可以是数值、字符串或 Date 对象\n * @returns 解析后的 Date 对象\n * @throws {SyntaxError} 如果无法解析为有效的日期对象,则抛出错误\n * @example\n * ```typescript\n * dateParse('2023-01-01'); // Date对象\n * dateParse(1672531200000); // Date对象\n * dateParse(new Date()); // Date对象\n * dateParse('invalid date'); // 抛出 SyntaxError\n * ```\n */\nexport function dateParse(dateValue: DateValue): DateLike {\n // 传入的 Date 对象有 Date、TzDate\n // @ts-ignore\n const d1 = isDate(dateValue)\n ? new Date(dateValue)\n : dateValue instanceof TzDate\n ? new TzDate(dateValue)\n : new Date(dateValue);\n if (isValidDate(d1)) return d1;\n\n // safari 浏览器的日期解析有问题\n // new Date('2020-06-26 18:06:15') 返回值是一个非法日期对象\n const d2 = _guessDateSeparator(dateValue);\n if (isValidDate(d2)) return d2;\n\n // safari 浏览器的日期解析有问题\n // new Date('2020-06-26T18:06:15.000+0800') 返回值是一个非法日期对象\n const d3 = _guessDateTimezone(dateValue);\n if (isValidDate(d3)) return d3;\n\n throw new SyntaxError(`${dateValue.toString()} 不是一个合法的日期值`);\n}\n\nfunction _pad(num: number, len = 2) {\n return `${num}`.padStart(len, '0');\n}\n\nconst rules: [RegExp, (date: DateLike) => number | string][] = [\n [/Y{4}/gi, (date) => date.getFullYear()],\n [/Y{2}/gi, (date) => date.getFullYear() % 100],\n [/M{2}/g, (date) => _pad(date.getMonth() + 1)],\n [/M{1}/g, (date) => date.getMonth() + 1],\n [/D{2}/gi, (date) => _pad(date.getDate())],\n [/D{1}/gi, (date) => date.getDate()],\n [/H{2}/g, (date) => _pad(date.getHours())],\n [/H{1}/g, (date) => date.getHours()],\n [\n /h{2}/g,\n (date) => {\n const h = date.getHours();\n return _pad(h > 12 ? h - 12 : h);\n },\n ],\n [\n /h{1}/g,\n (date) => {\n const h = date.getHours();\n return h > 12 ? h - 12 : h;\n },\n ],\n [/m{2}/g, (date) => _pad(date.getMinutes())],\n [/m{1}/g, (date) => date.getMinutes()],\n [/s{2}/g, (date) => _pad(date.getSeconds())],\n [/s{1}/g, (date) => date.getSeconds()],\n [/S{3}/g, (date) => _pad(date.getMilliseconds(), 3)],\n [/S{2}/g, (date) => _pad(date.getMilliseconds(), 2)],\n [/S{1}/g, (date) => date.getMilliseconds()],\n];\n\n/**\n * 格式化为日期字符串(带自定义格式化模板)\n * @param dateValue - 可以是数值、字符串或 Date 对象\n * @param format - 模板,默认是 'YYYY-MM-DD HH:mm:ss',模板字符:\n * - YYYY:年\n * - yyyy: 年\n * - MM:月\n * - DD:日\n * - dd: 日\n * - HH:时(24 小时制)\n * - hh:时(12 小时制)\n * - mm:分\n * - ss:秒\n * - SSS:毫秒\n * @returns 格式化后的日期字符串\n * @example\n * ```typescript\n * dateFormat(new Date(), 'YYYY-MM-DD'); // '2023-01-01'\n * dateFormat(1672531200000, 'YYYY/MM/DD HH:mm:ss'); // '2023/01/01 00:00:00'\n * dateFormat('2023-01-01', 'YYYY年MM月DD日'); // '2023年01月01日'\n * ```\n */\nexport function dateFormat(dateValue: DateValue, format = 'YYYY-MM-DD HH:mm:ss'): string {\n const date = dateParse(dateValue);\n let result = format;\n\n for (const rule of rules) {\n result = result.replace(rule[0], String(rule[1](date)));\n }\n\n return result;\n}\n"],"names":["isNumber","timestamp","isString","isDate"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"core.cjs","sources":["../src/date/timezone.ts","../src/date/core.ts"],"sourcesContent":["import { isNumber } from '../type';\nimport { dateFormat } from './core';\n\nexport type TzDateOptions = {\n /**\n * 时间戳\n * @default Date.now()\n */\n timestamp?: number;\n\n /**\n * 日期值\n */\n value?: readonly [\n year?: number,\n month?: number,\n day?: number,\n hours?: number,\n minutes?: number,\n seconds?: number,\n milliseconds?: number,\n ];\n\n /**\n * 时区偏移量,单位为分钟,默认为当前时区\n */\n offset?: number;\n};\n\nconst TZ_OFFSET_MS = 60 * 1000;\n\nexport class TzDate {\n #timestamp: number;\n #targetDate: Date;\n #utcDate: Date;\n\n #localTZOffset = TzDate.getOffset();\n #localTzOffsetMS = this.#localTZOffset * TZ_OFFSET_MS;\n\n #targetTzOffset = 0;\n #targetTzOffsetMS = 0;\n\n #options: TzDateOptions;\n\n constructor(options?: TzDateOptions | TzDate) {\n this.#options = (options instanceof TzDate ? options.#options : options) || {};\n const { offset, timestamp, value } = this.#options;\n this.#targetTzOffset = isNumber(offset) ? offset : this.#localTZOffset;\n this.#targetTzOffsetMS = this.#targetTzOffset * TZ_OFFSET_MS;\n\n if (Array.isArray(value) && value.length > 0) {\n const [fullYear, month, day, hours, minutes, seconds, milliseconds] = value;\n const timestamp = Date.UTC(\n fullYear ?? 0,\n month ?? 0,\n day ?? 1,\n hours ?? 0,\n minutes ?? 0,\n seconds ?? 0,\n milliseconds ?? 0,\n );\n\n this.#timestamp = timestamp + this.#targetTzOffsetMS;\n } else {\n this.#timestamp = timestamp || Date.now();\n }\n\n this.#targetDate = new Date(this.#timestamp + this.#localTzOffsetMS - this.#targetTzOffsetMS);\n this.#utcDate = new Date(this.#timestamp + this.#localTzOffsetMS);\n }\n\n #updateTimestamp() {\n this.#timestamp = this.#targetDate.getTime() + this.#targetTzOffsetMS - this.#localTzOffsetMS;\n this.#utcDate = new Date(this.#timestamp + this.#localTzOffsetMS);\n }\n\n getTimezoneOffset() {\n return this.#targetTzOffset;\n }\n\n getTimezoneOrder() {\n return TzDate.getOrder(this.#targetTzOffset);\n }\n\n getFullYear() {\n return this.#targetDate.getFullYear();\n }\n\n getMonth() {\n return this.#targetDate.getMonth();\n }\n\n getDate() {\n return this.#targetDate.getDate();\n }\n\n getHours() {\n return this.#targetDate.getHours();\n }\n\n getMinutes() {\n return this.#targetDate.getMinutes();\n }\n\n getSeconds() {\n return this.#targetDate.getSeconds();\n }\n\n getMilliseconds() {\n return this.#targetDate.getMilliseconds();\n }\n\n setFullYear(year: number, month?: number, date?: number) {\n this.#targetDate.setFullYear(year);\n this.#updateTimestamp();\n\n if (isNumber(month)) this.setMonth(month);\n if (isNumber(date)) this.setDate(date);\n\n return this.getTime();\n }\n\n setMonth(month: number, date?: number) {\n this.#targetDate.setMonth(month);\n this.#updateTimestamp();\n\n if (isNumber(date)) this.setDate(date);\n\n return this.getTime();\n }\n\n setDate(date: number) {\n this.#targetDate.setDate(date);\n this.#updateTimestamp();\n\n return this.getTime();\n }\n\n setHours(hours: number, minutes?: number, seconds?: number, milliseconds?: number) {\n this.#targetDate.setHours(hours);\n this.#updateTimestamp();\n\n if (isNumber(minutes)) this.setMinutes(minutes);\n if (isNumber(seconds)) this.setSeconds(seconds);\n if (isNumber(milliseconds)) this.setMilliseconds(milliseconds);\n\n return this.getTime();\n }\n\n setMinutes(minutes: number, seconds?: number, milliseconds?: number) {\n this.#targetDate.setMinutes(minutes);\n this.#updateTimestamp();\n\n if (isNumber(seconds)) this.setSeconds(seconds);\n if (isNumber(milliseconds)) this.setMilliseconds(milliseconds);\n\n return this.getTime();\n }\n\n setSeconds(seconds: number, milliseconds?: number) {\n this.#targetDate.setSeconds(seconds);\n this.#updateTimestamp();\n\n if (isNumber(milliseconds)) this.setMilliseconds(milliseconds);\n\n return this.getTime();\n }\n\n setMilliseconds(milliseconds: number) {\n this.#targetDate.setMilliseconds(milliseconds);\n this.#updateTimestamp();\n\n return this.getTime();\n }\n\n getTime() {\n return this.#timestamp;\n }\n\n getDay() {\n return this.#targetDate.getDay();\n }\n\n toISOString() {\n return dateFormat(this.#utcDate, 'YYYY-MM-DDTHH:mm:ss.SSSZ');\n }\n\n /**\n * 创建一个 TzDate 对象\n * @param td - 需要转换的日期对象\n * @param offset - 目标时区分钟偏移量,默认为当前时区\n * @returns 返回一个 TzDate 对象\n * @example\n * ```js\n * const tzDate = TzDate.from(new TzDate());\n * ```\n */\n static from(td: TzDate, offset = TzDate.getOffset()) {\n return new TzDate({\n offset: offset,\n timestamp: td.getTime(),\n });\n }\n\n /**\n * 获取时区序号\n * @param offset - 默认使用当前时区分钟偏移量\n */\n static getOrder(offset = TzDate.getOffset()) {\n return offset / -60;\n }\n\n /**\n * 获取时区分钟偏移量\n * @param gmtOrder - 默认使用当前时区序号\n */\n static getOffset(gmtOrder?: number) {\n return isNumber(gmtOrder) ? gmtOrder * -60 : new Date().getTimezoneOffset();\n }\n}\n","import { objectEach } from '@/object';\nimport { isDate, isString } from '@/type';\nimport { TzDate } from './timezone';\n\n/**\n * 判断一个值是否为有效的日期对象\n * @param unknown - 需要判断的值\n * @returns 如果值是有效的日期对象则返回 true,否则返回 false\n * @example\n * ```typescript\n * isValidDate(new Date()); // true\n * isValidDate('2023-01-01'); // false\n * isValidDate(NaN); // false\n * ```\n */\nexport function isValidDate(unknown: unknown): unknown is Date | TzDate {\n return (\n (unknown instanceof Date && !Number.isNaN(unknown.getTime())) ||\n (unknown instanceof TzDate && !Number.isNaN(unknown.getTime()))\n );\n}\n\nexport type DateLike = Date | TzDate;\nexport type DateValue = number | string | DateLike;\n\nfunction _guessDateSeparator(value: DateValue): Date | undefined {\n if (!isString(value)) return;\n\n const value2 = value.replace(/-/g, '/');\n\n return new Date(value2);\n}\n\nfunction _guessDateTimezone(value: DateValue): Date | undefined {\n if (!isString(value)) return;\n\n const re = /([+-])(\\d\\d)(\\d\\d)$/;\n\n const matches = re.exec(value);\n\n if (!matches) return;\n\n const value2 = value.replace(re, 'Z');\n const d = new Date(value2);\n\n if (!isValidDate(d)) return;\n\n const [, flag, hours, minutes] = matches;\n const hours2 = Number.parseInt(hours, 10);\n const minutes2 = Number.parseInt(minutes, 10);\n const offset = (a: number, b: number): number => (flag === '+' ? a - b : a + b);\n\n d.setHours(offset(d.getHours(), hours2));\n d.setMinutes(offset(d.getMinutes(), minutes2));\n\n return d;\n}\n\n/**\n * 解析为Date对象\n * @param dateValue - 可以是数值、字符串或 Date 对象\n * @returns 解析后的 Date 对象\n * @throws {SyntaxError} 如果无法解析为有效的日期对象,则抛出错误\n * @example\n * ```typescript\n * dateParse('2023-01-01'); // Date对象\n * dateParse(1672531200000); // Date对象\n * dateParse(new Date()); // Date对象\n * dateParse('invalid date'); // 抛出 SyntaxError\n * ```\n */\nexport function dateParse(dateValue: DateValue): DateLike {\n // 传入的 Date 对象有 Date、TzDate\n // @ts-ignore\n const d1 = isDate(dateValue)\n ? new Date(dateValue)\n : dateValue instanceof TzDate\n ? new TzDate(dateValue)\n : new Date(dateValue);\n if (isValidDate(d1)) return d1;\n\n // safari 浏览器的日期解析有问题\n // new Date('2020-06-26 18:06:15') 返回值是一个非法日期对象\n const d2 = _guessDateSeparator(dateValue);\n if (isValidDate(d2)) return d2;\n\n // safari 浏览器的日期解析有问题\n // new Date('2020-06-26T18:06:15.000+0800') 返回值是一个非法日期对象\n const d3 = _guessDateTimezone(dateValue);\n if (isValidDate(d3)) return d3;\n\n throw new SyntaxError(`${dateValue.toString()} 不是一个合法的日期值`);\n}\n\nfunction _pad(num: number, len = 2) {\n return `${num}`.padStart(len, '0');\n}\n\nconst rules: [RegExp, (date: DateLike) => number | string][] = [\n [/Y{4}/gi, (date) => date.getFullYear()],\n [/Y{2}/gi, (date) => date.getFullYear() % 100],\n [/M{2}/g, (date) => _pad(date.getMonth() + 1)],\n [/M{1}/g, (date) => date.getMonth() + 1],\n [/D{2}/gi, (date) => _pad(date.getDate())],\n [/D{1}/gi, (date) => date.getDate()],\n [/H{2}/g, (date) => _pad(date.getHours())],\n [/H{1}/g, (date) => date.getHours()],\n [\n /h{2}/g,\n (date) => {\n const h = date.getHours();\n return _pad(h > 12 ? h - 12 : h);\n },\n ],\n [\n /h{1}/g,\n (date) => {\n const h = date.getHours();\n return h > 12 ? h - 12 : h;\n },\n ],\n [/m{2}/g, (date) => _pad(date.getMinutes())],\n [/m{1}/g, (date) => date.getMinutes()],\n [/s{2}/g, (date) => _pad(date.getSeconds())],\n [/s{1}/g, (date) => date.getSeconds()],\n [/S{3}/g, (date) => _pad(date.getMilliseconds(), 3)],\n [/S{2}/g, (date) => _pad(date.getMilliseconds(), 2)],\n [/S{1}/g, (date) => date.getMilliseconds()],\n];\n\n/**\n * 格式化为日期字符串(带自定义格式化模板)\n * @param dateValue - 可以是数值、字符串或 Date 对象\n * @param format - 模板,默认是 'YYYY-MM-DD HH:mm:ss',模板字符:\n * - YYYY:年\n * - yyyy: 年\n * - MM:月\n * - DD:日\n * - dd: 日\n * - HH:时(24 小时制)\n * - hh:时(12 小时制)\n * - mm:分\n * - ss:秒\n * - SSS:毫秒\n * @returns 格式化后的日期字符串\n * @example\n * ```typescript\n * dateFormat(new Date(), 'YYYY-MM-DD'); // '2023-01-01'\n * dateFormat(1672531200000, 'YYYY/MM/DD HH:mm:ss'); // '2023/01/01 00:00:00'\n * dateFormat('2023-01-01', 'YYYY年MM月DD日'); // '2023年01月01日'\n * ```\n */\nexport function dateFormat(dateValue: DateValue, format = 'YYYY-MM-DD HH:mm:ss'): string {\n const date = dateParse(dateValue);\n let result = format;\n\n for (const rule of rules) {\n result = result.replace(rule[0], String(rule[1](date)));\n }\n\n return result;\n}\n"],"names":["isNumber","timestamp","isString","isDate"],"mappings":"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"}
|
package/dist/core.mjs
CHANGED
|
@@ -1,29 +1,19 @@
|
|
|
1
|
-
var __typeError = (msg) => {
|
|
2
|
-
throw TypeError(msg);
|
|
3
|
-
};
|
|
4
|
-
var __accessCheck = (obj, member, msg) => member.has(obj) || __typeError("Cannot " + msg);
|
|
5
|
-
var __privateGet = (obj, member, getter) => (__accessCheck(obj, member, "read from private field"), getter ? getter.call(obj) : member.get(obj));
|
|
6
|
-
var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
|
|
7
|
-
var __privateSet = (obj, member, value, setter) => (__accessCheck(obj, member, "write to private field"), setter ? setter.call(obj, value) : member.set(obj, value), value);
|
|
8
|
-
var __privateMethod = (obj, member, method) => (__accessCheck(obj, member, "access private method"), method);
|
|
9
|
-
var _timestamp, _targetDate, _utcDate, _localTZOffset, _localTzOffsetMS, _targetTzOffset, _targetTzOffsetMS, _options, _TzDate_instances, updateTimestamp_fn;
|
|
10
1
|
import { isNumber, isDate, isString } from "./type.mjs";
|
|
11
2
|
const TZ_OFFSET_MS = 60 * 1e3;
|
|
12
|
-
|
|
3
|
+
class TzDate {
|
|
4
|
+
#timestamp;
|
|
5
|
+
#targetDate;
|
|
6
|
+
#utcDate;
|
|
7
|
+
#localTZOffset = TzDate.getOffset();
|
|
8
|
+
#localTzOffsetMS = this.#localTZOffset * TZ_OFFSET_MS;
|
|
9
|
+
#targetTzOffset = 0;
|
|
10
|
+
#targetTzOffsetMS = 0;
|
|
11
|
+
#options;
|
|
13
12
|
constructor(options) {
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
__privateAdd(this, _localTZOffset, _TzDate.getOffset());
|
|
19
|
-
__privateAdd(this, _localTzOffsetMS, __privateGet(this, _localTZOffset) * TZ_OFFSET_MS);
|
|
20
|
-
__privateAdd(this, _targetTzOffset, 0);
|
|
21
|
-
__privateAdd(this, _targetTzOffsetMS, 0);
|
|
22
|
-
__privateAdd(this, _options);
|
|
23
|
-
__privateSet(this, _options, (options instanceof _TzDate ? __privateGet(options, _options) : options) || {});
|
|
24
|
-
const { offset, timestamp, value } = __privateGet(this, _options);
|
|
25
|
-
__privateSet(this, _targetTzOffset, isNumber(offset) ? offset : __privateGet(this, _localTZOffset));
|
|
26
|
-
__privateSet(this, _targetTzOffsetMS, __privateGet(this, _targetTzOffset) * TZ_OFFSET_MS);
|
|
13
|
+
this.#options = (options instanceof TzDate ? options.#options : options) || {};
|
|
14
|
+
const { offset, timestamp, value } = this.#options;
|
|
15
|
+
this.#targetTzOffset = isNumber(offset) ? offset : this.#localTZOffset;
|
|
16
|
+
this.#targetTzOffsetMS = this.#targetTzOffset * TZ_OFFSET_MS;
|
|
27
17
|
if (Array.isArray(value) && value.length > 0) {
|
|
28
18
|
const [fullYear, month, day, hours, minutes, seconds, milliseconds] = value;
|
|
29
19
|
const timestamp2 = Date.UTC(
|
|
@@ -35,92 +25,96 @@ const _TzDate = class _TzDate {
|
|
|
35
25
|
seconds ?? 0,
|
|
36
26
|
milliseconds ?? 0
|
|
37
27
|
);
|
|
38
|
-
|
|
28
|
+
this.#timestamp = timestamp2 + this.#targetTzOffsetMS;
|
|
39
29
|
} else {
|
|
40
|
-
|
|
30
|
+
this.#timestamp = timestamp || Date.now();
|
|
41
31
|
}
|
|
42
|
-
|
|
43
|
-
|
|
32
|
+
this.#targetDate = new Date(this.#timestamp + this.#localTzOffsetMS - this.#targetTzOffsetMS);
|
|
33
|
+
this.#utcDate = new Date(this.#timestamp + this.#localTzOffsetMS);
|
|
34
|
+
}
|
|
35
|
+
#updateTimestamp() {
|
|
36
|
+
this.#timestamp = this.#targetDate.getTime() + this.#targetTzOffsetMS - this.#localTzOffsetMS;
|
|
37
|
+
this.#utcDate = new Date(this.#timestamp + this.#localTzOffsetMS);
|
|
44
38
|
}
|
|
45
39
|
getTimezoneOffset() {
|
|
46
|
-
return
|
|
40
|
+
return this.#targetTzOffset;
|
|
47
41
|
}
|
|
48
42
|
getTimezoneOrder() {
|
|
49
|
-
return
|
|
43
|
+
return TzDate.getOrder(this.#targetTzOffset);
|
|
50
44
|
}
|
|
51
45
|
getFullYear() {
|
|
52
|
-
return
|
|
46
|
+
return this.#targetDate.getFullYear();
|
|
53
47
|
}
|
|
54
48
|
getMonth() {
|
|
55
|
-
return
|
|
49
|
+
return this.#targetDate.getMonth();
|
|
56
50
|
}
|
|
57
51
|
getDate() {
|
|
58
|
-
return
|
|
52
|
+
return this.#targetDate.getDate();
|
|
59
53
|
}
|
|
60
54
|
getHours() {
|
|
61
|
-
return
|
|
55
|
+
return this.#targetDate.getHours();
|
|
62
56
|
}
|
|
63
57
|
getMinutes() {
|
|
64
|
-
return
|
|
58
|
+
return this.#targetDate.getMinutes();
|
|
65
59
|
}
|
|
66
60
|
getSeconds() {
|
|
67
|
-
return
|
|
61
|
+
return this.#targetDate.getSeconds();
|
|
68
62
|
}
|
|
69
63
|
getMilliseconds() {
|
|
70
|
-
return
|
|
64
|
+
return this.#targetDate.getMilliseconds();
|
|
71
65
|
}
|
|
72
66
|
setFullYear(year, month, date) {
|
|
73
|
-
|
|
74
|
-
|
|
67
|
+
this.#targetDate.setFullYear(year);
|
|
68
|
+
this.#updateTimestamp();
|
|
75
69
|
if (isNumber(month)) this.setMonth(month);
|
|
76
70
|
if (isNumber(date)) this.setDate(date);
|
|
77
71
|
return this.getTime();
|
|
78
72
|
}
|
|
79
73
|
setMonth(month, date) {
|
|
80
|
-
|
|
81
|
-
|
|
74
|
+
this.#targetDate.setMonth(month);
|
|
75
|
+
this.#updateTimestamp();
|
|
82
76
|
if (isNumber(date)) this.setDate(date);
|
|
83
77
|
return this.getTime();
|
|
84
78
|
}
|
|
85
79
|
setDate(date) {
|
|
86
|
-
|
|
87
|
-
|
|
80
|
+
this.#targetDate.setDate(date);
|
|
81
|
+
this.#updateTimestamp();
|
|
88
82
|
return this.getTime();
|
|
89
83
|
}
|
|
90
84
|
setHours(hours, minutes, seconds, milliseconds) {
|
|
91
|
-
|
|
92
|
-
|
|
85
|
+
this.#targetDate.setHours(hours);
|
|
86
|
+
this.#updateTimestamp();
|
|
93
87
|
if (isNumber(minutes)) this.setMinutes(minutes);
|
|
94
88
|
if (isNumber(seconds)) this.setSeconds(seconds);
|
|
95
89
|
if (isNumber(milliseconds)) this.setMilliseconds(milliseconds);
|
|
96
90
|
return this.getTime();
|
|
97
91
|
}
|
|
98
92
|
setMinutes(minutes, seconds, milliseconds) {
|
|
99
|
-
|
|
100
|
-
|
|
93
|
+
this.#targetDate.setMinutes(minutes);
|
|
94
|
+
this.#updateTimestamp();
|
|
101
95
|
if (isNumber(seconds)) this.setSeconds(seconds);
|
|
102
96
|
if (isNumber(milliseconds)) this.setMilliseconds(milliseconds);
|
|
103
97
|
return this.getTime();
|
|
104
98
|
}
|
|
105
99
|
setSeconds(seconds, milliseconds) {
|
|
106
|
-
|
|
107
|
-
|
|
100
|
+
this.#targetDate.setSeconds(seconds);
|
|
101
|
+
this.#updateTimestamp();
|
|
108
102
|
if (isNumber(milliseconds)) this.setMilliseconds(milliseconds);
|
|
109
103
|
return this.getTime();
|
|
110
104
|
}
|
|
111
105
|
setMilliseconds(milliseconds) {
|
|
112
|
-
|
|
113
|
-
|
|
106
|
+
this.#targetDate.setMilliseconds(milliseconds);
|
|
107
|
+
this.#updateTimestamp();
|
|
114
108
|
return this.getTime();
|
|
115
109
|
}
|
|
116
110
|
getTime() {
|
|
117
|
-
return
|
|
111
|
+
return this.#timestamp;
|
|
118
112
|
}
|
|
119
113
|
getDay() {
|
|
120
|
-
return
|
|
114
|
+
return this.#targetDate.getDay();
|
|
121
115
|
}
|
|
122
116
|
toISOString() {
|
|
123
|
-
return dateFormat(
|
|
117
|
+
return dateFormat(this.#utcDate, "YYYY-MM-DDTHH:mm:ss.SSSZ");
|
|
124
118
|
}
|
|
125
119
|
/**
|
|
126
120
|
* 创建一个 TzDate 对象
|
|
@@ -132,8 +126,8 @@ const _TzDate = class _TzDate {
|
|
|
132
126
|
* const tzDate = TzDate.from(new TzDate());
|
|
133
127
|
* ```
|
|
134
128
|
*/
|
|
135
|
-
static from(td, offset =
|
|
136
|
-
return new
|
|
129
|
+
static from(td, offset = TzDate.getOffset()) {
|
|
130
|
+
return new TzDate({
|
|
137
131
|
offset,
|
|
138
132
|
timestamp: td.getTime()
|
|
139
133
|
});
|
|
@@ -142,7 +136,7 @@ const _TzDate = class _TzDate {
|
|
|
142
136
|
* 获取时区序号
|
|
143
137
|
* @param offset - 默认使用当前时区分钟偏移量
|
|
144
138
|
*/
|
|
145
|
-
static getOrder(offset =
|
|
139
|
+
static getOrder(offset = TzDate.getOffset()) {
|
|
146
140
|
return offset / -60;
|
|
147
141
|
}
|
|
148
142
|
/**
|
|
@@ -152,21 +146,7 @@ const _TzDate = class _TzDate {
|
|
|
152
146
|
static getOffset(gmtOrder) {
|
|
153
147
|
return isNumber(gmtOrder) ? gmtOrder * -60 : (/* @__PURE__ */ new Date()).getTimezoneOffset();
|
|
154
148
|
}
|
|
155
|
-
}
|
|
156
|
-
_timestamp = new WeakMap();
|
|
157
|
-
_targetDate = new WeakMap();
|
|
158
|
-
_utcDate = new WeakMap();
|
|
159
|
-
_localTZOffset = new WeakMap();
|
|
160
|
-
_localTzOffsetMS = new WeakMap();
|
|
161
|
-
_targetTzOffset = new WeakMap();
|
|
162
|
-
_targetTzOffsetMS = new WeakMap();
|
|
163
|
-
_options = new WeakMap();
|
|
164
|
-
_TzDate_instances = new WeakSet();
|
|
165
|
-
updateTimestamp_fn = function() {
|
|
166
|
-
__privateSet(this, _timestamp, __privateGet(this, _targetDate).getTime() + __privateGet(this, _targetTzOffsetMS) - __privateGet(this, _localTzOffsetMS));
|
|
167
|
-
__privateSet(this, _utcDate, new Date(__privateGet(this, _timestamp) + __privateGet(this, _localTzOffsetMS)));
|
|
168
|
-
};
|
|
169
|
-
let TzDate = _TzDate;
|
|
149
|
+
}
|
|
170
150
|
function isValidDate(unknown) {
|
|
171
151
|
return unknown instanceof Date && !Number.isNaN(unknown.getTime()) || unknown instanceof TzDate && !Number.isNaN(unknown.getTime());
|
|
172
152
|
}
|
package/dist/core.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"core.mjs","sources":["../src/date/timezone.ts","../src/date/core.ts"],"sourcesContent":["import { isNumber } from '../type';\nimport { dateFormat } from './core';\n\nexport type TzDateOptions = {\n /**\n * 时间戳\n * @default Date.now()\n */\n timestamp?: number;\n\n /**\n * 日期值\n */\n value?: readonly [\n year?: number,\n month?: number,\n day?: number,\n hours?: number,\n minutes?: number,\n seconds?: number,\n milliseconds?: number,\n ];\n\n /**\n * 时区偏移量,单位为分钟,默认为当前时区\n */\n offset?: number;\n};\n\nconst TZ_OFFSET_MS = 60 * 1000;\n\nexport class TzDate {\n #timestamp: number;\n #targetDate: Date;\n #utcDate: Date;\n\n #localTZOffset = TzDate.getOffset();\n #localTzOffsetMS = this.#localTZOffset * TZ_OFFSET_MS;\n\n #targetTzOffset = 0;\n #targetTzOffsetMS = 0;\n\n #options: TzDateOptions;\n\n constructor(options?: TzDateOptions | TzDate) {\n this.#options = (options instanceof TzDate ? options.#options : options) || {};\n const { offset, timestamp, value } = this.#options;\n this.#targetTzOffset = isNumber(offset) ? offset : this.#localTZOffset;\n this.#targetTzOffsetMS = this.#targetTzOffset * TZ_OFFSET_MS;\n\n if (Array.isArray(value) && value.length > 0) {\n const [fullYear, month, day, hours, minutes, seconds, milliseconds] = value;\n const timestamp = Date.UTC(\n fullYear ?? 0,\n month ?? 0,\n day ?? 1,\n hours ?? 0,\n minutes ?? 0,\n seconds ?? 0,\n milliseconds ?? 0,\n );\n\n this.#timestamp = timestamp + this.#targetTzOffsetMS;\n } else {\n this.#timestamp = timestamp || Date.now();\n }\n\n this.#targetDate = new Date(this.#timestamp + this.#localTzOffsetMS - this.#targetTzOffsetMS);\n this.#utcDate = new Date(this.#timestamp + this.#localTzOffsetMS);\n }\n\n #updateTimestamp() {\n this.#timestamp = this.#targetDate.getTime() + this.#targetTzOffsetMS - this.#localTzOffsetMS;\n this.#utcDate = new Date(this.#timestamp + this.#localTzOffsetMS);\n }\n\n getTimezoneOffset() {\n return this.#targetTzOffset;\n }\n\n getTimezoneOrder() {\n return TzDate.getOrder(this.#targetTzOffset);\n }\n\n getFullYear() {\n return this.#targetDate.getFullYear();\n }\n\n getMonth() {\n return this.#targetDate.getMonth();\n }\n\n getDate() {\n return this.#targetDate.getDate();\n }\n\n getHours() {\n return this.#targetDate.getHours();\n }\n\n getMinutes() {\n return this.#targetDate.getMinutes();\n }\n\n getSeconds() {\n return this.#targetDate.getSeconds();\n }\n\n getMilliseconds() {\n return this.#targetDate.getMilliseconds();\n }\n\n setFullYear(year: number, month?: number, date?: number) {\n this.#targetDate.setFullYear(year);\n this.#updateTimestamp();\n\n if (isNumber(month)) this.setMonth(month);\n if (isNumber(date)) this.setDate(date);\n\n return this.getTime();\n }\n\n setMonth(month: number, date?: number) {\n this.#targetDate.setMonth(month);\n this.#updateTimestamp();\n\n if (isNumber(date)) this.setDate(date);\n\n return this.getTime();\n }\n\n setDate(date: number) {\n this.#targetDate.setDate(date);\n this.#updateTimestamp();\n\n return this.getTime();\n }\n\n setHours(hours: number, minutes?: number, seconds?: number, milliseconds?: number) {\n this.#targetDate.setHours(hours);\n this.#updateTimestamp();\n\n if (isNumber(minutes)) this.setMinutes(minutes);\n if (isNumber(seconds)) this.setSeconds(seconds);\n if (isNumber(milliseconds)) this.setMilliseconds(milliseconds);\n\n return this.getTime();\n }\n\n setMinutes(minutes: number, seconds?: number, milliseconds?: number) {\n this.#targetDate.setMinutes(minutes);\n this.#updateTimestamp();\n\n if (isNumber(seconds)) this.setSeconds(seconds);\n if (isNumber(milliseconds)) this.setMilliseconds(milliseconds);\n\n return this.getTime();\n }\n\n setSeconds(seconds: number, milliseconds?: number) {\n this.#targetDate.setSeconds(seconds);\n this.#updateTimestamp();\n\n if (isNumber(milliseconds)) this.setMilliseconds(milliseconds);\n\n return this.getTime();\n }\n\n setMilliseconds(milliseconds: number) {\n this.#targetDate.setMilliseconds(milliseconds);\n this.#updateTimestamp();\n\n return this.getTime();\n }\n\n getTime() {\n return this.#timestamp;\n }\n\n getDay() {\n return this.#targetDate.getDay();\n }\n\n toISOString() {\n return dateFormat(this.#utcDate, 'YYYY-MM-DDTHH:mm:ss.SSSZ');\n }\n\n /**\n * 创建一个 TzDate 对象\n * @param td - 需要转换的日期对象\n * @param offset - 目标时区分钟偏移量,默认为当前时区\n * @returns 返回一个 TzDate 对象\n * @example\n * ```js\n * const tzDate = TzDate.from(new TzDate());\n * ```\n */\n static from(td: TzDate, offset = TzDate.getOffset()) {\n return new TzDate({\n offset: offset,\n timestamp: td.getTime(),\n });\n }\n\n /**\n * 获取时区序号\n * @param offset - 默认使用当前时区分钟偏移量\n */\n static getOrder(offset = TzDate.getOffset()) {\n return offset / -60;\n }\n\n /**\n * 获取时区分钟偏移量\n * @param gmtOrder - 默认使用当前时区序号\n */\n static getOffset(gmtOrder?: number) {\n return isNumber(gmtOrder) ? gmtOrder * -60 : new Date().getTimezoneOffset();\n }\n}\n","import { objectEach } from '@/object';\nimport { isDate, isString } from '@/type';\nimport { TzDate } from './timezone';\n\n/**\n * 判断一个值是否为有效的日期对象\n * @param unknown - 需要判断的值\n * @returns 如果值是有效的日期对象则返回 true,否则返回 false\n * @example\n * ```typescript\n * isValidDate(new Date()); // true\n * isValidDate('2023-01-01'); // false\n * isValidDate(NaN); // false\n * ```\n */\nexport function isValidDate(unknown: unknown): unknown is Date | TzDate {\n return (\n (unknown instanceof Date && !Number.isNaN(unknown.getTime())) ||\n (unknown instanceof TzDate && !Number.isNaN(unknown.getTime()))\n );\n}\n\nexport type DateLike = Date | TzDate;\nexport type DateValue = number | string | DateLike;\n\nfunction _guessDateSeparator(value: DateValue): Date | undefined {\n if (!isString(value)) return;\n\n const value2 = value.replace(/-/g, '/');\n\n return new Date(value2);\n}\n\nfunction _guessDateTimezone(value: DateValue): Date | undefined {\n if (!isString(value)) return;\n\n const re = /([+-])(\\d\\d)(\\d\\d)$/;\n\n const matches = re.exec(value);\n\n if (!matches) return;\n\n const value2 = value.replace(re, 'Z');\n const d = new Date(value2);\n\n if (!isValidDate(d)) return;\n\n const [, flag, hours, minutes] = matches;\n const hours2 = Number.parseInt(hours, 10);\n const minutes2 = Number.parseInt(minutes, 10);\n const offset = (a: number, b: number): number => (flag === '+' ? a - b : a + b);\n\n d.setHours(offset(d.getHours(), hours2));\n d.setMinutes(offset(d.getMinutes(), minutes2));\n\n return d;\n}\n\n/**\n * 解析为Date对象\n * @param dateValue - 可以是数值、字符串或 Date 对象\n * @returns 解析后的 Date 对象\n * @throws {SyntaxError} 如果无法解析为有效的日期对象,则抛出错误\n * @example\n * ```typescript\n * dateParse('2023-01-01'); // Date对象\n * dateParse(1672531200000); // Date对象\n * dateParse(new Date()); // Date对象\n * dateParse('invalid date'); // 抛出 SyntaxError\n * ```\n */\nexport function dateParse(dateValue: DateValue): DateLike {\n // 传入的 Date 对象有 Date、TzDate\n // @ts-ignore\n const d1 = isDate(dateValue)\n ? new Date(dateValue)\n : dateValue instanceof TzDate\n ? new TzDate(dateValue)\n : new Date(dateValue);\n if (isValidDate(d1)) return d1;\n\n // safari 浏览器的日期解析有问题\n // new Date('2020-06-26 18:06:15') 返回值是一个非法日期对象\n const d2 = _guessDateSeparator(dateValue);\n if (isValidDate(d2)) return d2;\n\n // safari 浏览器的日期解析有问题\n // new Date('2020-06-26T18:06:15.000+0800') 返回值是一个非法日期对象\n const d3 = _guessDateTimezone(dateValue);\n if (isValidDate(d3)) return d3;\n\n throw new SyntaxError(`${dateValue.toString()} 不是一个合法的日期值`);\n}\n\nfunction _pad(num: number, len = 2) {\n return `${num}`.padStart(len, '0');\n}\n\nconst rules: [RegExp, (date: DateLike) => number | string][] = [\n [/Y{4}/gi, (date) => date.getFullYear()],\n [/Y{2}/gi, (date) => date.getFullYear() % 100],\n [/M{2}/g, (date) => _pad(date.getMonth() + 1)],\n [/M{1}/g, (date) => date.getMonth() + 1],\n [/D{2}/gi, (date) => _pad(date.getDate())],\n [/D{1}/gi, (date) => date.getDate()],\n [/H{2}/g, (date) => _pad(date.getHours())],\n [/H{1}/g, (date) => date.getHours()],\n [\n /h{2}/g,\n (date) => {\n const h = date.getHours();\n return _pad(h > 12 ? h - 12 : h);\n },\n ],\n [\n /h{1}/g,\n (date) => {\n const h = date.getHours();\n return h > 12 ? h - 12 : h;\n },\n ],\n [/m{2}/g, (date) => _pad(date.getMinutes())],\n [/m{1}/g, (date) => date.getMinutes()],\n [/s{2}/g, (date) => _pad(date.getSeconds())],\n [/s{1}/g, (date) => date.getSeconds()],\n [/S{3}/g, (date) => _pad(date.getMilliseconds(), 3)],\n [/S{2}/g, (date) => _pad(date.getMilliseconds(), 2)],\n [/S{1}/g, (date) => date.getMilliseconds()],\n];\n\n/**\n * 格式化为日期字符串(带自定义格式化模板)\n * @param dateValue - 可以是数值、字符串或 Date 对象\n * @param format - 模板,默认是 'YYYY-MM-DD HH:mm:ss',模板字符:\n * - YYYY:年\n * - yyyy: 年\n * - MM:月\n * - DD:日\n * - dd: 日\n * - HH:时(24 小时制)\n * - hh:时(12 小时制)\n * - mm:分\n * - ss:秒\n * - SSS:毫秒\n * @returns 格式化后的日期字符串\n * @example\n * ```typescript\n * dateFormat(new Date(), 'YYYY-MM-DD'); // '2023-01-01'\n * dateFormat(1672531200000, 'YYYY/MM/DD HH:mm:ss'); // '2023/01/01 00:00:00'\n * dateFormat('2023-01-01', 'YYYY年MM月DD日'); // '2023年01月01日'\n * ```\n */\nexport function dateFormat(dateValue: DateValue, format = 'YYYY-MM-DD HH:mm:ss'): string {\n const date = dateParse(dateValue);\n let result = format;\n\n for (const rule of rules) {\n result = result.replace(rule[0], String(rule[1](date)));\n }\n\n return result;\n}\n"],"names":["timestamp"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"core.mjs","sources":["../src/date/timezone.ts","../src/date/core.ts"],"sourcesContent":["import { isNumber } from '../type';\nimport { dateFormat } from './core';\n\nexport type TzDateOptions = {\n /**\n * 时间戳\n * @default Date.now()\n */\n timestamp?: number;\n\n /**\n * 日期值\n */\n value?: readonly [\n year?: number,\n month?: number,\n day?: number,\n hours?: number,\n minutes?: number,\n seconds?: number,\n milliseconds?: number,\n ];\n\n /**\n * 时区偏移量,单位为分钟,默认为当前时区\n */\n offset?: number;\n};\n\nconst TZ_OFFSET_MS = 60 * 1000;\n\nexport class TzDate {\n #timestamp: number;\n #targetDate: Date;\n #utcDate: Date;\n\n #localTZOffset = TzDate.getOffset();\n #localTzOffsetMS = this.#localTZOffset * TZ_OFFSET_MS;\n\n #targetTzOffset = 0;\n #targetTzOffsetMS = 0;\n\n #options: TzDateOptions;\n\n constructor(options?: TzDateOptions | TzDate) {\n this.#options = (options instanceof TzDate ? options.#options : options) || {};\n const { offset, timestamp, value } = this.#options;\n this.#targetTzOffset = isNumber(offset) ? offset : this.#localTZOffset;\n this.#targetTzOffsetMS = this.#targetTzOffset * TZ_OFFSET_MS;\n\n if (Array.isArray(value) && value.length > 0) {\n const [fullYear, month, day, hours, minutes, seconds, milliseconds] = value;\n const timestamp = Date.UTC(\n fullYear ?? 0,\n month ?? 0,\n day ?? 1,\n hours ?? 0,\n minutes ?? 0,\n seconds ?? 0,\n milliseconds ?? 0,\n );\n\n this.#timestamp = timestamp + this.#targetTzOffsetMS;\n } else {\n this.#timestamp = timestamp || Date.now();\n }\n\n this.#targetDate = new Date(this.#timestamp + this.#localTzOffsetMS - this.#targetTzOffsetMS);\n this.#utcDate = new Date(this.#timestamp + this.#localTzOffsetMS);\n }\n\n #updateTimestamp() {\n this.#timestamp = this.#targetDate.getTime() + this.#targetTzOffsetMS - this.#localTzOffsetMS;\n this.#utcDate = new Date(this.#timestamp + this.#localTzOffsetMS);\n }\n\n getTimezoneOffset() {\n return this.#targetTzOffset;\n }\n\n getTimezoneOrder() {\n return TzDate.getOrder(this.#targetTzOffset);\n }\n\n getFullYear() {\n return this.#targetDate.getFullYear();\n }\n\n getMonth() {\n return this.#targetDate.getMonth();\n }\n\n getDate() {\n return this.#targetDate.getDate();\n }\n\n getHours() {\n return this.#targetDate.getHours();\n }\n\n getMinutes() {\n return this.#targetDate.getMinutes();\n }\n\n getSeconds() {\n return this.#targetDate.getSeconds();\n }\n\n getMilliseconds() {\n return this.#targetDate.getMilliseconds();\n }\n\n setFullYear(year: number, month?: number, date?: number) {\n this.#targetDate.setFullYear(year);\n this.#updateTimestamp();\n\n if (isNumber(month)) this.setMonth(month);\n if (isNumber(date)) this.setDate(date);\n\n return this.getTime();\n }\n\n setMonth(month: number, date?: number) {\n this.#targetDate.setMonth(month);\n this.#updateTimestamp();\n\n if (isNumber(date)) this.setDate(date);\n\n return this.getTime();\n }\n\n setDate(date: number) {\n this.#targetDate.setDate(date);\n this.#updateTimestamp();\n\n return this.getTime();\n }\n\n setHours(hours: number, minutes?: number, seconds?: number, milliseconds?: number) {\n this.#targetDate.setHours(hours);\n this.#updateTimestamp();\n\n if (isNumber(minutes)) this.setMinutes(minutes);\n if (isNumber(seconds)) this.setSeconds(seconds);\n if (isNumber(milliseconds)) this.setMilliseconds(milliseconds);\n\n return this.getTime();\n }\n\n setMinutes(minutes: number, seconds?: number, milliseconds?: number) {\n this.#targetDate.setMinutes(minutes);\n this.#updateTimestamp();\n\n if (isNumber(seconds)) this.setSeconds(seconds);\n if (isNumber(milliseconds)) this.setMilliseconds(milliseconds);\n\n return this.getTime();\n }\n\n setSeconds(seconds: number, milliseconds?: number) {\n this.#targetDate.setSeconds(seconds);\n this.#updateTimestamp();\n\n if (isNumber(milliseconds)) this.setMilliseconds(milliseconds);\n\n return this.getTime();\n }\n\n setMilliseconds(milliseconds: number) {\n this.#targetDate.setMilliseconds(milliseconds);\n this.#updateTimestamp();\n\n return this.getTime();\n }\n\n getTime() {\n return this.#timestamp;\n }\n\n getDay() {\n return this.#targetDate.getDay();\n }\n\n toISOString() {\n return dateFormat(this.#utcDate, 'YYYY-MM-DDTHH:mm:ss.SSSZ');\n }\n\n /**\n * 创建一个 TzDate 对象\n * @param td - 需要转换的日期对象\n * @param offset - 目标时区分钟偏移量,默认为当前时区\n * @returns 返回一个 TzDate 对象\n * @example\n * ```js\n * const tzDate = TzDate.from(new TzDate());\n * ```\n */\n static from(td: TzDate, offset = TzDate.getOffset()) {\n return new TzDate({\n offset: offset,\n timestamp: td.getTime(),\n });\n }\n\n /**\n * 获取时区序号\n * @param offset - 默认使用当前时区分钟偏移量\n */\n static getOrder(offset = TzDate.getOffset()) {\n return offset / -60;\n }\n\n /**\n * 获取时区分钟偏移量\n * @param gmtOrder - 默认使用当前时区序号\n */\n static getOffset(gmtOrder?: number) {\n return isNumber(gmtOrder) ? gmtOrder * -60 : new Date().getTimezoneOffset();\n }\n}\n","import { objectEach } from '@/object';\nimport { isDate, isString } from '@/type';\nimport { TzDate } from './timezone';\n\n/**\n * 判断一个值是否为有效的日期对象\n * @param unknown - 需要判断的值\n * @returns 如果值是有效的日期对象则返回 true,否则返回 false\n * @example\n * ```typescript\n * isValidDate(new Date()); // true\n * isValidDate('2023-01-01'); // false\n * isValidDate(NaN); // false\n * ```\n */\nexport function isValidDate(unknown: unknown): unknown is Date | TzDate {\n return (\n (unknown instanceof Date && !Number.isNaN(unknown.getTime())) ||\n (unknown instanceof TzDate && !Number.isNaN(unknown.getTime()))\n );\n}\n\nexport type DateLike = Date | TzDate;\nexport type DateValue = number | string | DateLike;\n\nfunction _guessDateSeparator(value: DateValue): Date | undefined {\n if (!isString(value)) return;\n\n const value2 = value.replace(/-/g, '/');\n\n return new Date(value2);\n}\n\nfunction _guessDateTimezone(value: DateValue): Date | undefined {\n if (!isString(value)) return;\n\n const re = /([+-])(\\d\\d)(\\d\\d)$/;\n\n const matches = re.exec(value);\n\n if (!matches) return;\n\n const value2 = value.replace(re, 'Z');\n const d = new Date(value2);\n\n if (!isValidDate(d)) return;\n\n const [, flag, hours, minutes] = matches;\n const hours2 = Number.parseInt(hours, 10);\n const minutes2 = Number.parseInt(minutes, 10);\n const offset = (a: number, b: number): number => (flag === '+' ? a - b : a + b);\n\n d.setHours(offset(d.getHours(), hours2));\n d.setMinutes(offset(d.getMinutes(), minutes2));\n\n return d;\n}\n\n/**\n * 解析为Date对象\n * @param dateValue - 可以是数值、字符串或 Date 对象\n * @returns 解析后的 Date 对象\n * @throws {SyntaxError} 如果无法解析为有效的日期对象,则抛出错误\n * @example\n * ```typescript\n * dateParse('2023-01-01'); // Date对象\n * dateParse(1672531200000); // Date对象\n * dateParse(new Date()); // Date对象\n * dateParse('invalid date'); // 抛出 SyntaxError\n * ```\n */\nexport function dateParse(dateValue: DateValue): DateLike {\n // 传入的 Date 对象有 Date、TzDate\n // @ts-ignore\n const d1 = isDate(dateValue)\n ? new Date(dateValue)\n : dateValue instanceof TzDate\n ? new TzDate(dateValue)\n : new Date(dateValue);\n if (isValidDate(d1)) return d1;\n\n // safari 浏览器的日期解析有问题\n // new Date('2020-06-26 18:06:15') 返回值是一个非法日期对象\n const d2 = _guessDateSeparator(dateValue);\n if (isValidDate(d2)) return d2;\n\n // safari 浏览器的日期解析有问题\n // new Date('2020-06-26T18:06:15.000+0800') 返回值是一个非法日期对象\n const d3 = _guessDateTimezone(dateValue);\n if (isValidDate(d3)) return d3;\n\n throw new SyntaxError(`${dateValue.toString()} 不是一个合法的日期值`);\n}\n\nfunction _pad(num: number, len = 2) {\n return `${num}`.padStart(len, '0');\n}\n\nconst rules: [RegExp, (date: DateLike) => number | string][] = [\n [/Y{4}/gi, (date) => date.getFullYear()],\n [/Y{2}/gi, (date) => date.getFullYear() % 100],\n [/M{2}/g, (date) => _pad(date.getMonth() + 1)],\n [/M{1}/g, (date) => date.getMonth() + 1],\n [/D{2}/gi, (date) => _pad(date.getDate())],\n [/D{1}/gi, (date) => date.getDate()],\n [/H{2}/g, (date) => _pad(date.getHours())],\n [/H{1}/g, (date) => date.getHours()],\n [\n /h{2}/g,\n (date) => {\n const h = date.getHours();\n return _pad(h > 12 ? h - 12 : h);\n },\n ],\n [\n /h{1}/g,\n (date) => {\n const h = date.getHours();\n return h > 12 ? h - 12 : h;\n },\n ],\n [/m{2}/g, (date) => _pad(date.getMinutes())],\n [/m{1}/g, (date) => date.getMinutes()],\n [/s{2}/g, (date) => _pad(date.getSeconds())],\n [/s{1}/g, (date) => date.getSeconds()],\n [/S{3}/g, (date) => _pad(date.getMilliseconds(), 3)],\n [/S{2}/g, (date) => _pad(date.getMilliseconds(), 2)],\n [/S{1}/g, (date) => date.getMilliseconds()],\n];\n\n/**\n * 格式化为日期字符串(带自定义格式化模板)\n * @param dateValue - 可以是数值、字符串或 Date 对象\n * @param format - 模板,默认是 'YYYY-MM-DD HH:mm:ss',模板字符:\n * - YYYY:年\n * - yyyy: 年\n * - MM:月\n * - DD:日\n * - dd: 日\n * - HH:时(24 小时制)\n * - hh:时(12 小时制)\n * - mm:分\n * - ss:秒\n * - SSS:毫秒\n * @returns 格式化后的日期字符串\n * @example\n * ```typescript\n * dateFormat(new Date(), 'YYYY-MM-DD'); // '2023-01-01'\n * dateFormat(1672531200000, 'YYYY/MM/DD HH:mm:ss'); // '2023/01/01 00:00:00'\n * dateFormat('2023-01-01', 'YYYY年MM月DD日'); // '2023年01月01日'\n * ```\n */\nexport function dateFormat(dateValue: DateValue, format = 'YYYY-MM-DD HH:mm:ss'): string {\n const date = dateParse(dateValue);\n let result = format;\n\n for (const rule of rules) {\n result = result.replace(rule[0], String(rule[1](date)));\n }\n\n return result;\n}\n"],"names":["timestamp"],"mappings":"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"}
|