sculp-js 1.13.4 → 1.13.6
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/cjs/_virtual/_commonjsHelpers.js +3 -3
- package/dist/cjs/array.js +36 -46
- package/dist/cjs/async.js +41 -43
- package/dist/cjs/base64.js +77 -66
- package/dist/cjs/clipboard.js +54 -53
- package/dist/cjs/cloneDeep.js +90 -91
- package/dist/cjs/cookie.js +27 -30
- package/dist/cjs/date.js +101 -98
- package/dist/cjs/dom.js +114 -121
- package/dist/cjs/download.js +77 -78
- package/dist/cjs/easing.js +29 -32
- package/dist/cjs/file.js +147 -152
- package/dist/cjs/func.js +64 -78
- package/dist/cjs/index.js +1 -3
- package/dist/cjs/math.js +32 -38
- package/dist/cjs/node_modules/bezier-easing/src/index.js +35 -23
- package/dist/cjs/number.js +58 -61
- package/dist/cjs/object.js +112 -126
- package/dist/cjs/path.js +39 -43
- package/dist/cjs/qs.js +34 -41
- package/dist/cjs/random.js +31 -34
- package/dist/cjs/string.js +62 -63
- package/dist/cjs/tooltip.js +66 -69
- package/dist/cjs/tree.js +261 -258
- package/dist/cjs/type.js +42 -46
- package/dist/cjs/unique.js +39 -42
- package/dist/cjs/url.js +47 -48
- package/dist/cjs/validator.js +38 -38
- package/dist/cjs/variable.js +27 -21
- package/dist/cjs/watermark.js +78 -67
- package/dist/esm/array.js +36 -46
- package/dist/esm/async.js +41 -43
- package/dist/esm/base64.js +77 -66
- package/dist/esm/clipboard.js +55 -54
- package/dist/esm/cloneDeep.js +90 -91
- package/dist/esm/cookie.js +27 -30
- package/dist/esm/date.js +101 -98
- package/dist/esm/dom.js +114 -121
- package/dist/esm/download.js +78 -79
- package/dist/esm/easing.js +29 -32
- package/dist/esm/file.js +147 -152
- package/dist/esm/func.js +64 -78
- package/dist/esm/index.js +96 -8
- package/dist/esm/math.js +32 -38
- package/dist/esm/number.js +58 -61
- package/dist/esm/object.js +124 -127
- package/dist/esm/path.js +39 -43
- package/dist/esm/qs.js +34 -41
- package/dist/esm/random.js +31 -34
- package/dist/esm/string.js +74 -64
- package/dist/esm/tooltip.js +66 -69
- package/dist/esm/tree.js +261 -258
- package/dist/esm/type.js +68 -47
- package/dist/esm/unique.js +39 -42
- package/dist/esm/url.js +47 -48
- package/dist/esm/validator.js +56 -39
- package/dist/esm/variable.js +27 -21
- package/dist/esm/watermark.js +79 -68
- package/dist/umd/index.min.js +2 -2
- package/package.json +11 -6
package/dist/cjs/cloneDeep.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
* sculp-js v1.13.
|
|
2
|
+
* sculp-js v1.13.6
|
|
3
3
|
* (c) 2023-present chandq
|
|
4
4
|
* Released under the MIT License.
|
|
5
5
|
*/
|
|
@@ -17,101 +17,100 @@
|
|
|
17
17
|
* @returns {T}
|
|
18
18
|
*/
|
|
19
19
|
function cloneDeep(source, map = new WeakMap()) {
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
map.set(source, copy);
|
|
45
|
-
return copy;
|
|
46
|
-
}
|
|
47
|
-
// 处理 RegExp 对象
|
|
48
|
-
if (source instanceof RegExp) {
|
|
49
|
-
const copy = new RegExp(source.source, source.flags);
|
|
50
|
-
copy.lastIndex = source.lastIndex; // 保留匹配状态
|
|
51
|
-
map.set(source, copy);
|
|
52
|
-
return copy;
|
|
53
|
-
}
|
|
54
|
-
// 处理 Map
|
|
55
|
-
if (source instanceof Map) {
|
|
56
|
-
const copy = new Map();
|
|
57
|
-
map.set(source, copy);
|
|
58
|
-
source.forEach((value, key) => {
|
|
59
|
-
copy.set(cloneDeep(key, map), cloneDeep(value, map));
|
|
60
|
-
});
|
|
61
|
-
return copy;
|
|
62
|
-
}
|
|
63
|
-
// 处理 Set
|
|
64
|
-
if (source instanceof Set) {
|
|
65
|
-
const copy = new Set();
|
|
66
|
-
map.set(source, copy);
|
|
67
|
-
source.forEach(value => {
|
|
68
|
-
copy.add(cloneDeep(value, map));
|
|
69
|
-
});
|
|
70
|
-
return copy;
|
|
71
|
-
}
|
|
72
|
-
// 处理数组 (包含稀疏数组)
|
|
73
|
-
if (Array.isArray(source)) {
|
|
74
|
-
const copy = new Array(source.length);
|
|
75
|
-
map.set(source, copy);
|
|
76
|
-
// 克隆所有有效索引
|
|
77
|
-
for (let i = 0, len = source.length; i < len; i++) {
|
|
78
|
-
if (i in source) {
|
|
79
|
-
// 保留空位
|
|
80
|
-
copy[i] = cloneDeep(source[i], map);
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
// 克隆数组的自定义属性
|
|
84
|
-
const descriptors = Object.getOwnPropertyDescriptors(source);
|
|
85
|
-
for (const key of Reflect.ownKeys(descriptors)) {
|
|
86
|
-
Object.defineProperty(copy, key, {
|
|
87
|
-
...descriptors[key],
|
|
88
|
-
value: cloneDeep(descriptors[key].value, map)
|
|
89
|
-
});
|
|
90
|
-
}
|
|
91
|
-
return copy;
|
|
92
|
-
}
|
|
93
|
-
// 处理普通对象和类实例
|
|
94
|
-
const copy = Object.create(Object.getPrototypeOf(source));
|
|
20
|
+
// 处理原始类型和 null/undefined
|
|
21
|
+
if (source === null || typeof source !== 'object') {
|
|
22
|
+
return source;
|
|
23
|
+
}
|
|
24
|
+
// 处理循环引用
|
|
25
|
+
if (map.has(source)) {
|
|
26
|
+
return map.get(source);
|
|
27
|
+
}
|
|
28
|
+
// 处理 ArrayBuffer
|
|
29
|
+
if (source instanceof ArrayBuffer) {
|
|
30
|
+
const copy = new ArrayBuffer(source.byteLength);
|
|
31
|
+
new Uint8Array(copy).set(new Uint8Array(source));
|
|
32
|
+
map.set(source, copy);
|
|
33
|
+
return copy;
|
|
34
|
+
}
|
|
35
|
+
// 处理 DataView 和 TypedArray (Uint8Array 等)
|
|
36
|
+
if (ArrayBuffer.isView(source)) {
|
|
37
|
+
const constructor = source.constructor;
|
|
38
|
+
const bufferCopy = cloneDeep(source.buffer, map);
|
|
39
|
+
return new constructor(bufferCopy, source.byteOffset, source.length);
|
|
40
|
+
}
|
|
41
|
+
// 处理 Date 对象
|
|
42
|
+
if (source instanceof Date) {
|
|
43
|
+
const copy = new Date(source.getTime());
|
|
95
44
|
map.set(source, copy);
|
|
45
|
+
return copy;
|
|
46
|
+
}
|
|
47
|
+
// 处理 RegExp 对象
|
|
48
|
+
if (source instanceof RegExp) {
|
|
49
|
+
const copy = new RegExp(source.source, source.flags);
|
|
50
|
+
copy.lastIndex = source.lastIndex; // 保留匹配状态
|
|
51
|
+
map.set(source, copy);
|
|
52
|
+
return copy;
|
|
53
|
+
}
|
|
54
|
+
// 处理 Map
|
|
55
|
+
if (source instanceof Map) {
|
|
56
|
+
const copy = new Map();
|
|
57
|
+
map.set(source, copy);
|
|
58
|
+
source.forEach((value, key) => {
|
|
59
|
+
copy.set(cloneDeep(key, map), cloneDeep(value, map));
|
|
60
|
+
});
|
|
61
|
+
return copy;
|
|
62
|
+
}
|
|
63
|
+
// 处理 Set
|
|
64
|
+
if (source instanceof Set) {
|
|
65
|
+
const copy = new Set();
|
|
66
|
+
map.set(source, copy);
|
|
67
|
+
source.forEach(value => {
|
|
68
|
+
copy.add(cloneDeep(value, map));
|
|
69
|
+
});
|
|
70
|
+
return copy;
|
|
71
|
+
}
|
|
72
|
+
// 处理数组 (包含稀疏数组)
|
|
73
|
+
if (Array.isArray(source)) {
|
|
74
|
+
const copy = new Array(source.length);
|
|
75
|
+
map.set(source, copy);
|
|
76
|
+
// 克隆所有有效索引
|
|
77
|
+
for (let i = 0, len = source.length; i < len; i++) {
|
|
78
|
+
if (i in source) {
|
|
79
|
+
// 保留空位
|
|
80
|
+
copy[i] = cloneDeep(source[i], map);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
// 克隆数组的自定义属性
|
|
96
84
|
const descriptors = Object.getOwnPropertyDescriptors(source);
|
|
97
85
|
for (const key of Reflect.ownKeys(descriptors)) {
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
}
|
|
103
|
-
else {
|
|
104
|
-
// 处理访问器属性 (getter/setter)
|
|
105
|
-
if (descriptor.get) {
|
|
106
|
-
descriptor.get = cloneDeep(descriptor.get, map);
|
|
107
|
-
}
|
|
108
|
-
if (descriptor.set) {
|
|
109
|
-
descriptor.set = cloneDeep(descriptor.set, map);
|
|
110
|
-
}
|
|
111
|
-
}
|
|
112
|
-
Object.defineProperty(copy, key, descriptor);
|
|
86
|
+
Object.defineProperty(copy, key, {
|
|
87
|
+
...descriptors[key],
|
|
88
|
+
value: cloneDeep(descriptors[key].value, map)
|
|
89
|
+
});
|
|
113
90
|
}
|
|
114
91
|
return copy;
|
|
92
|
+
}
|
|
93
|
+
// 处理普通对象和类实例
|
|
94
|
+
const copy = Object.create(Object.getPrototypeOf(source));
|
|
95
|
+
map.set(source, copy);
|
|
96
|
+
const descriptors = Object.getOwnPropertyDescriptors(source);
|
|
97
|
+
for (const key of Reflect.ownKeys(descriptors)) {
|
|
98
|
+
const descriptor = descriptors[key];
|
|
99
|
+
if ('value' in descriptor) {
|
|
100
|
+
// 克隆数据属性
|
|
101
|
+
descriptor.value = cloneDeep(descriptor.value, map);
|
|
102
|
+
} else {
|
|
103
|
+
// 处理访问器属性 (getter/setter)
|
|
104
|
+
if (descriptor.get) {
|
|
105
|
+
descriptor.get = cloneDeep(descriptor.get, map);
|
|
106
|
+
}
|
|
107
|
+
if (descriptor.set) {
|
|
108
|
+
descriptor.set = cloneDeep(descriptor.set, map);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
Object.defineProperty(copy, key, descriptor);
|
|
112
|
+
}
|
|
113
|
+
return copy;
|
|
115
114
|
}
|
|
116
115
|
|
|
117
116
|
exports.cloneDeep = cloneDeep;
|
package/dist/cjs/cookie.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
* sculp-js v1.13.
|
|
2
|
+
* sculp-js v1.13.6
|
|
3
3
|
* (c) 2023-present chandq
|
|
4
4
|
* Released under the MIT License.
|
|
5
5
|
*/
|
|
@@ -14,17 +14,15 @@ var type = require('./type.js');
|
|
|
14
14
|
* @returns {string}
|
|
15
15
|
*/
|
|
16
16
|
function cookieGet(name) {
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
}
|
|
27
|
-
return '';
|
|
17
|
+
const { cookie } = document;
|
|
18
|
+
if (!cookie) return '';
|
|
19
|
+
const result = cookie.split(';');
|
|
20
|
+
for (let i = 0; i < result.length; i++) {
|
|
21
|
+
const item = result[i];
|
|
22
|
+
const [key, val = ''] = item.split('=');
|
|
23
|
+
if (key === name) return decodeURIComponent(val);
|
|
24
|
+
}
|
|
25
|
+
return '';
|
|
28
26
|
}
|
|
29
27
|
/**
|
|
30
28
|
* 设置 cookie
|
|
@@ -33,30 +31,29 @@ function cookieGet(name) {
|
|
|
33
31
|
* @param {number | Date} [maxAge]
|
|
34
32
|
*/
|
|
35
33
|
function cookieSet(name, value, maxAge) {
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
return `${key}=${val}`;
|
|
34
|
+
const metas = [];
|
|
35
|
+
const EXPIRES = 'expires';
|
|
36
|
+
metas.push([name, encodeURIComponent(value)]);
|
|
37
|
+
if (type.isNumber(maxAge)) {
|
|
38
|
+
const d = new Date();
|
|
39
|
+
d.setTime(d.getTime() + maxAge);
|
|
40
|
+
metas.push([EXPIRES, d.toUTCString()]);
|
|
41
|
+
} else if (type.isDate(maxAge)) {
|
|
42
|
+
metas.push([EXPIRES, maxAge.toUTCString()]);
|
|
43
|
+
}
|
|
44
|
+
metas.push(['path', '/']);
|
|
45
|
+
document.cookie = metas
|
|
46
|
+
.map(item => {
|
|
47
|
+
const [key, val] = item;
|
|
48
|
+
return `${key}=${val}`;
|
|
52
49
|
})
|
|
53
|
-
|
|
50
|
+
.join(';');
|
|
54
51
|
}
|
|
55
52
|
/**
|
|
56
53
|
* 删除单个 cookie
|
|
57
54
|
* @param name cookie 名称
|
|
58
55
|
*/
|
|
59
|
-
const cookieDel =
|
|
56
|
+
const cookieDel = name => cookieSet(name, '', -1);
|
|
60
57
|
|
|
61
58
|
exports.cookieDel = cookieDel;
|
|
62
59
|
exports.cookieGet = cookieGet;
|
package/dist/cjs/date.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
* sculp-js v1.13.
|
|
2
|
+
* sculp-js v1.13.6
|
|
3
3
|
* (c) 2023-present chandq
|
|
4
4
|
* Released under the MIT License.
|
|
5
5
|
*/
|
|
@@ -8,33 +8,29 @@
|
|
|
8
8
|
|
|
9
9
|
var type = require('./type.js');
|
|
10
10
|
|
|
11
|
-
const isValidDate =
|
|
11
|
+
const isValidDate = any => type.isDate(any) && !type.isNaN(any.getTime());
|
|
12
12
|
/* istanbul ignore next */
|
|
13
|
-
const guessDateSeparator =
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
return new Date(value2);
|
|
13
|
+
const guessDateSeparator = value => {
|
|
14
|
+
if (!type.isString(value)) return;
|
|
15
|
+
const value2 = value.replace(/-/g, '/');
|
|
16
|
+
return new Date(value2);
|
|
18
17
|
};
|
|
19
18
|
/* istanbul ignore next */
|
|
20
|
-
const guessDateTimezone =
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
d.setHours(offset(d.getHours(), hours2));
|
|
36
|
-
d.setMinutes(offset(d.getMinutes(), minutes2));
|
|
37
|
-
return d;
|
|
19
|
+
const guessDateTimezone = value => {
|
|
20
|
+
if (!type.isString(value)) return;
|
|
21
|
+
const re = /([+-])(\d\d)(\d\d)$/;
|
|
22
|
+
const matches = re.exec(value);
|
|
23
|
+
if (!matches) return;
|
|
24
|
+
const value2 = value.replace(re, 'Z');
|
|
25
|
+
const d = new Date(value2);
|
|
26
|
+
if (!isValidDate(d)) return;
|
|
27
|
+
const [, flag, hours, minutes] = matches;
|
|
28
|
+
const hours2 = parseInt(hours, 10);
|
|
29
|
+
const minutes2 = parseInt(minutes, 10);
|
|
30
|
+
const offset = (a, b) => (flag === '+' ? a - b : a + b);
|
|
31
|
+
d.setHours(offset(d.getHours(), hours2));
|
|
32
|
+
d.setMinutes(offset(d.getMinutes(), minutes2));
|
|
33
|
+
return d;
|
|
38
34
|
};
|
|
39
35
|
/**
|
|
40
36
|
* 解析为Date对象
|
|
@@ -42,24 +38,21 @@ const guessDateTimezone = (value) => {
|
|
|
42
38
|
* @returns {Date} - 转换后的目标Date
|
|
43
39
|
*/
|
|
44
40
|
function dateParse(value) {
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
if (isValidDate(d3))
|
|
61
|
-
return d3;
|
|
62
|
-
throw new SyntaxError(`${value.toString()} 不是一个合法的日期描述`);
|
|
41
|
+
const d1 = new Date(value);
|
|
42
|
+
if (isValidDate(d1)) return d1;
|
|
43
|
+
// safari 浏览器的日期解析有问题
|
|
44
|
+
// new Date('2020-06-26 18:06:15') 返回值是一个非法日期对象
|
|
45
|
+
/* istanbul ignore next */
|
|
46
|
+
const d2 = guessDateSeparator(value);
|
|
47
|
+
/* istanbul ignore next */
|
|
48
|
+
if (isValidDate(d2)) return d2;
|
|
49
|
+
// safari 浏览器的日期解析有问题
|
|
50
|
+
// new Date('2020-06-26T18:06:15.000+0800') 返回值是一个非法日期对象
|
|
51
|
+
/* istanbul ignore next */
|
|
52
|
+
const d3 = guessDateTimezone(value);
|
|
53
|
+
/* istanbul ignore next */
|
|
54
|
+
if (isValidDate(d3)) return d3;
|
|
55
|
+
throw new SyntaxError(`${value.toString()} 不是一个合法的日期描述`);
|
|
63
56
|
}
|
|
64
57
|
/**
|
|
65
58
|
* 格式化为日期对象(带自定义格式化模板)
|
|
@@ -106,8 +99,8 @@ function dateParse(value) {
|
|
|
106
99
|
* @returns {Date}
|
|
107
100
|
*/
|
|
108
101
|
function dateToStart(value) {
|
|
109
|
-
|
|
110
|
-
|
|
102
|
+
const d = dateParse(value);
|
|
103
|
+
return new Date(d.getFullYear(), d.getMonth(), d.getDate(), 0, 0, 0, 0);
|
|
111
104
|
}
|
|
112
105
|
/**
|
|
113
106
|
* 将日期转换为一天的结束时间,即23点59分59秒999毫秒
|
|
@@ -115,9 +108,9 @@ function dateToStart(value) {
|
|
|
115
108
|
* @returns {Date}
|
|
116
109
|
*/
|
|
117
110
|
function dateToEnd(value) {
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
111
|
+
const d = dateToStart(value);
|
|
112
|
+
d.setDate(d.getDate() + 1);
|
|
113
|
+
return dateParse(d.getTime() - 1);
|
|
121
114
|
}
|
|
122
115
|
/**
|
|
123
116
|
* 格式化为日期对象(带自定义格式化模板)
|
|
@@ -136,29 +129,29 @@ function dateToEnd(value) {
|
|
|
136
129
|
* @returns {string} 格式化后的日期字符串
|
|
137
130
|
*/
|
|
138
131
|
function formatDate(value, format = 'YYYY-MM-DD HH:mm:ss') {
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
}
|
|
132
|
+
const date = dateParse(value);
|
|
133
|
+
let fmt = format;
|
|
134
|
+
let ret;
|
|
135
|
+
const opt = {
|
|
136
|
+
'Y+': `${date.getFullYear()}`,
|
|
137
|
+
'y+': `${date.getFullYear()}`,
|
|
138
|
+
'M+': `${date.getMonth() + 1}`,
|
|
139
|
+
'D+': `${date.getDate()}`,
|
|
140
|
+
'd+': `${date.getDate()}`,
|
|
141
|
+
'H+': `${date.getHours()}`,
|
|
142
|
+
'm+': `${date.getMinutes()}`,
|
|
143
|
+
's+': `${date.getSeconds()}`,
|
|
144
|
+
'S+': `${date.getMilliseconds()}`,
|
|
145
|
+
'w+': ['周日', '周一', '周二', '周三', '周四', '周五', '周六'][date.getDay()] // 周
|
|
146
|
+
// 有其他格式化字符需求可以继续添加,必须转化成字符串
|
|
147
|
+
};
|
|
148
|
+
for (const k in opt) {
|
|
149
|
+
ret = new RegExp('(' + k + ')').exec(fmt);
|
|
150
|
+
if (ret) {
|
|
151
|
+
fmt = fmt.replace(ret[1], ret[1].length === 1 ? opt[k] : opt[k].padStart(ret[1].length, '0'));
|
|
160
152
|
}
|
|
161
|
-
|
|
153
|
+
}
|
|
154
|
+
return fmt;
|
|
162
155
|
}
|
|
163
156
|
/**
|
|
164
157
|
* 计算向前或向后N天的具体日期
|
|
@@ -168,17 +161,18 @@ function formatDate(value, format = 'YYYY-MM-DD HH:mm:ss') {
|
|
|
168
161
|
* @returns {string} 计算后的目标日期
|
|
169
162
|
*/
|
|
170
163
|
function calculateDate(originDate, n, sep = '-') {
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
164
|
+
//originDate 为字符串日期 如:'2019-01-01' n为你要传入的参数,当前为0,前一天为-1,后一天为1
|
|
165
|
+
const date = new Date(originDate); //这边给定一个特定时间
|
|
166
|
+
const newDate = new Date(date.getFullYear(), date.getMonth(), date.getDate());
|
|
167
|
+
const millisecondGap = newDate.getTime() + 1000 * 60 * 60 * 24 * parseInt(String(n)); //计算前几天用减,计算后几天用加,最后一个就是多少天的数量
|
|
168
|
+
const targetDate = new Date(millisecondGap);
|
|
169
|
+
const finalNewDate =
|
|
170
|
+
targetDate.getFullYear() +
|
|
171
|
+
sep +
|
|
172
|
+
String(targetDate.getMonth() + 1).padStart(2, '0') +
|
|
173
|
+
'-' +
|
|
174
|
+
String(targetDate.getDate()).padStart(2, '0');
|
|
175
|
+
return finalNewDate;
|
|
182
176
|
}
|
|
183
177
|
/**
|
|
184
178
|
* 计算向前或向后N天的具体日期时间
|
|
@@ -189,23 +183,32 @@ function calculateDate(originDate, n, sep = '-') {
|
|
|
189
183
|
* @returns {string} 转换后的目标日期时间
|
|
190
184
|
*/
|
|
191
185
|
function calculateDateTime(originDateTime, n, dateSep = '-', timeSep = ':') {
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
186
|
+
const date = new Date(originDateTime);
|
|
187
|
+
const separator1 = dateSep;
|
|
188
|
+
const separator2 = timeSep;
|
|
189
|
+
const dateTime = new Date(
|
|
190
|
+
date.getFullYear(),
|
|
191
|
+
date.getMonth(),
|
|
192
|
+
date.getDate(),
|
|
193
|
+
date.getHours(),
|
|
194
|
+
date.getMinutes(),
|
|
195
|
+
date.getSeconds()
|
|
196
|
+
);
|
|
197
|
+
const millisecondGap = dateTime.getTime() + 1000 * 60 * 60 * 24 * parseInt(String(n)); //计算前几天用减,计算后几天用加,最后一个就是多少天的数量
|
|
198
|
+
const targetDateTime = new Date(millisecondGap);
|
|
199
|
+
return (
|
|
200
|
+
targetDateTime.getFullYear() +
|
|
201
|
+
separator1 +
|
|
202
|
+
String(targetDateTime.getMonth() + 1).padStart(2, '0') +
|
|
203
|
+
separator1 +
|
|
204
|
+
String(targetDateTime.getDate()).padStart(2, '0') +
|
|
205
|
+
' ' +
|
|
206
|
+
String(targetDateTime.getHours()).padStart(2, '0') +
|
|
207
|
+
separator2 +
|
|
208
|
+
String(targetDateTime.getMinutes()).padStart(2, '0') +
|
|
209
|
+
separator2 +
|
|
210
|
+
String(targetDateTime.getSeconds()).padStart(2, '0')
|
|
211
|
+
);
|
|
209
212
|
}
|
|
210
213
|
|
|
211
214
|
exports.calculateDate = calculateDate;
|