@ivujs/i-utils 2.0.0 → 2.1.1

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.
Files changed (228) hide show
  1. package/README.md +40 -42
  2. package/dist/cjs/ID-card/index.cjs +21 -13
  3. package/dist/cjs/array/index.cjs +40 -34
  4. package/dist/cjs/clipboard/index.cjs +14 -10
  5. package/dist/cjs/color/index.cjs +73 -59
  6. package/dist/cjs/constants/date.cjs +55 -1
  7. package/dist/cjs/constants/id-card.cjs +42 -1
  8. package/dist/cjs/constants/keycode.cjs +117 -2
  9. package/dist/cjs/constants/lang.cjs +7 -1
  10. package/dist/cjs/constants/math.cjs +9 -1
  11. package/dist/cjs/constants/regexp.cjs +33 -10
  12. package/dist/cjs/constants/sort.cjs +10 -1
  13. package/dist/cjs/cookie/index.cjs +16 -13
  14. package/dist/cjs/crypto/base64/base64.cjs +398 -206
  15. package/dist/cjs/crypto/base64/index.cjs +58 -35
  16. package/dist/cjs/crypto/md5/index.cjs +33 -8
  17. package/dist/cjs/crypto/md5/md5.cjs +298 -844
  18. package/dist/cjs/crypto/sha256/index.cjs +95 -0
  19. package/dist/cjs/crypto/sha256/sha256.cjs +557 -0
  20. package/dist/cjs/crypto/sm3/index.cjs +27 -0
  21. package/dist/cjs/crypto/sm3/sm3.cjs +200 -0
  22. package/dist/cjs/crypto/sm4/index.cjs +101 -0
  23. package/dist/cjs/crypto/sm4/sm4.cjs +498 -0
  24. package/dist/cjs/date/index.cjs +420 -340
  25. package/dist/cjs/desensitized/index.cjs +21 -18
  26. package/dist/cjs/device/index.cjs +33 -30
  27. package/dist/cjs/dom/index.cjs +26 -23
  28. package/dist/cjs/file/index.cjs +51 -41
  29. package/dist/cjs/function/index.cjs +22 -19
  30. package/dist/cjs/id/index.cjs +6 -2
  31. package/dist/cjs/index.cjs +110 -127
  32. package/dist/cjs/keycode/index.cjs +9 -12
  33. package/dist/cjs/math/index.cjs +113 -81
  34. package/dist/cjs/number/index.cjs +10 -7
  35. package/dist/cjs/object/index.cjs +77 -30
  36. package/dist/cjs/pagination/index.cjs +25 -10
  37. package/dist/cjs/random/index.cjs +8 -5
  38. package/dist/cjs/regexp/index.cjs +23 -20
  39. package/dist/cjs/storage/index.cjs +4 -1
  40. package/dist/cjs/storage/localStorage.cjs +5 -5
  41. package/dist/cjs/storage/sessionStorage.cjs +6 -6
  42. package/dist/cjs/string/index.cjs +66 -63
  43. package/dist/cjs/url/index.cjs +83 -80
  44. package/dist/cjs/validate/index.cjs +122 -106
  45. package/dist/es/ID-card/index.d.ts +19 -14
  46. package/dist/es/ID-card/index.mjs +22 -14
  47. package/dist/es/array/index.d.ts +56 -50
  48. package/dist/es/array/index.mjs +40 -34
  49. package/dist/es/clipboard/index.d.ts +10 -7
  50. package/dist/es/clipboard/index.mjs +14 -10
  51. package/dist/es/color/index.d.ts +28 -25
  52. package/dist/es/color/index.mjs +73 -59
  53. package/dist/es/constants/date.d.ts +58 -174
  54. package/dist/es/constants/date.mjs +55 -1
  55. package/dist/es/constants/id-card.d.ts +45 -43
  56. package/dist/es/constants/id-card.mjs +42 -1
  57. package/dist/es/constants/index.d.ts +11 -7
  58. package/dist/es/constants/keycode.d.ts +119 -103
  59. package/dist/es/constants/keycode.mjs +117 -2
  60. package/dist/es/constants/lang.d.ts +10 -4
  61. package/dist/es/constants/lang.mjs +7 -1
  62. package/dist/es/constants/math.d.ts +12 -4
  63. package/dist/es/constants/math.mjs +9 -1
  64. package/dist/es/constants/regexp.d.ts +27 -24
  65. package/dist/es/constants/regexp.mjs +33 -10
  66. package/dist/es/constants/sort.d.ts +13 -5
  67. package/dist/es/constants/sort.mjs +10 -1
  68. package/dist/es/cookie/index.d.ts +13 -13
  69. package/dist/es/cookie/index.mjs +16 -13
  70. package/dist/es/crypto/base64/base64.d.ts +8 -5
  71. package/dist/es/crypto/base64/base64.mjs +393 -204
  72. package/dist/es/crypto/base64/index.d.ts +41 -24
  73. package/dist/es/crypto/base64/index.mjs +53 -32
  74. package/dist/es/crypto/index.d.ts +8 -8
  75. package/dist/es/crypto/md5/index.d.ts +20 -7
  76. package/dist/es/crypto/md5/index.mjs +32 -9
  77. package/dist/es/crypto/md5/md5.d.ts +9 -142
  78. package/dist/es/crypto/md5/md5.mjs +299 -844
  79. package/dist/es/crypto/sha256/index.d.ts +52 -0
  80. package/dist/es/crypto/sha256/index.mjs +86 -0
  81. package/dist/es/crypto/sha256/sha256.d.ts +82 -0
  82. package/dist/es/crypto/sha256/sha256.mjs +548 -0
  83. package/dist/es/crypto/sm3/index.d.ts +13 -0
  84. package/dist/es/crypto/sm3/index.mjs +24 -0
  85. package/dist/es/crypto/sm3/sm3.d.ts +3 -0
  86. package/dist/es/crypto/sm3/sm3.mjs +197 -0
  87. package/dist/es/crypto/sm4/index.d.ts +56 -0
  88. package/dist/es/crypto/sm4/index.mjs +95 -0
  89. package/dist/es/crypto/sm4/sm4.d.ts +48 -0
  90. package/dist/es/crypto/sm4/sm4.mjs +490 -0
  91. package/dist/es/date/index.d.ts +269 -179
  92. package/dist/es/date/index.mjs +417 -340
  93. package/dist/es/desensitized/index.d.ts +26 -23
  94. package/dist/es/desensitized/index.mjs +21 -18
  95. package/dist/es/device/index.d.ts +31 -25
  96. package/dist/es/device/index.mjs +33 -30
  97. package/dist/es/dom/index.d.ts +32 -29
  98. package/dist/es/dom/index.mjs +26 -23
  99. package/dist/es/file/index.d.ts +30 -30
  100. package/dist/es/file/index.mjs +51 -41
  101. package/dist/es/function/index.d.ts +10 -7
  102. package/dist/es/function/index.mjs +22 -19
  103. package/dist/es/id/index.d.ts +3 -0
  104. package/dist/es/id/index.mjs +6 -2
  105. package/dist/es/index.d.ts +24 -25
  106. package/dist/es/index.mjs +6 -23
  107. package/dist/es/keycode/index.d.ts +6 -6
  108. package/dist/es/keycode/index.mjs +9 -12
  109. package/dist/es/math/index.d.ts +37 -37
  110. package/dist/es/math/index.mjs +113 -81
  111. package/dist/es/number/index.d.ts +7 -7
  112. package/dist/es/number/index.mjs +10 -7
  113. package/dist/es/object/index.d.ts +20 -19
  114. package/dist/es/object/index.mjs +77 -30
  115. package/dist/es/pagination/index.d.ts +39 -6
  116. package/dist/es/pagination/index.mjs +25 -10
  117. package/dist/es/random/index.d.ts +10 -7
  118. package/dist/es/random/index.mjs +8 -5
  119. package/dist/es/regexp/index.d.ts +30 -30
  120. package/dist/es/regexp/index.mjs +23 -20
  121. package/dist/es/storage/index.d.ts +10 -4
  122. package/dist/es/storage/index.mjs +4 -1
  123. package/dist/es/storage/localStorage.d.ts +9 -9
  124. package/dist/es/storage/localStorage.mjs +5 -5
  125. package/dist/es/storage/sessionStorage.d.ts +9 -9
  126. package/dist/es/storage/sessionStorage.mjs +6 -6
  127. package/dist/es/string/index.d.ts +62 -59
  128. package/dist/es/string/index.mjs +66 -63
  129. package/dist/es/url/index.d.ts +65 -65
  130. package/dist/es/url/index.mjs +83 -80
  131. package/dist/es/validate/index.d.ts +83 -80
  132. package/dist/es/validate/index.mjs +122 -106
  133. package/dist/index.d.ts +2643 -2803
  134. package/dist/lib/index.full.umd.js +3609 -9494
  135. package/dist/lib/index.full.umd.min.js +2 -64
  136. package/dist/lib/index.full.umd.min.js.map +1 -1
  137. package/dist/resolver/auto-imports.cjs +40 -31
  138. package/dist/resolver/auto-imports.mjs +40 -31
  139. package/dist/resolver/index.cjs +1 -2
  140. package/dist/resolver/index.d.ts +1 -1
  141. package/dist/resolver/index.mjs +1 -2
  142. package/package.json +96 -90
  143. package/dist/cjs/crypto/aes/aes.cjs +0 -480
  144. package/dist/cjs/crypto/aes/index.cjs +0 -27
  145. package/dist/cjs/crypto/base32/base32.cjs +0 -357
  146. package/dist/cjs/crypto/base32/index.cjs +0 -41
  147. package/dist/cjs/crypto/des/des.cjs +0 -257
  148. package/dist/cjs/crypto/des/index.cjs +0 -28
  149. package/dist/cjs/crypto/sha/sha1/index.cjs +0 -24
  150. package/dist/cjs/crypto/sha/sha1/sha1.cjs +0 -529
  151. package/dist/cjs/crypto/sha/sha256/index.cjs +0 -43
  152. package/dist/cjs/crypto/sha/sha256/sha256.cjs +0 -595
  153. package/dist/cjs/crypto/sha/sha3/index.cjs +0 -41
  154. package/dist/cjs/crypto/sha/sha3/sha3.cjs +0 -624
  155. package/dist/cjs/crypto/sha/sha512/index.cjs +0 -81
  156. package/dist/cjs/crypto/sha/sha512/sha512.cjs +0 -950
  157. package/dist/cjs/crypto/sm/lib/asn1.cjs +0 -149
  158. package/dist/cjs/crypto/sm/lib/ec.cjs +0 -315
  159. package/dist/cjs/crypto/sm/lib/jsbn.cjs +0 -1608
  160. package/dist/cjs/crypto/sm/lib/sm3.cjs +0 -158
  161. package/dist/cjs/crypto/sm/lib/utils.cjs +0 -170
  162. package/dist/cjs/crypto/sm/sm2/index.cjs +0 -112
  163. package/dist/cjs/crypto/sm/sm2/sm2.cjs +0 -231
  164. package/dist/cjs/crypto/sm/sm3/index.cjs +0 -15
  165. package/dist/cjs/crypto/sm/sm3/sm3.cjs +0 -93
  166. package/dist/cjs/crypto/sm/sm4/index.cjs +0 -27
  167. package/dist/cjs/crypto/sm/sm4/sm4.cjs +0 -327
  168. package/dist/cjs/crypto/tea/index.cjs +0 -25
  169. package/dist/cjs/crypto/tea/tea.cjs +0 -187
  170. package/dist/cjs/weapp/index.cjs +0 -142
  171. package/dist/es/crypto/aes/aes.d.ts +0 -156
  172. package/dist/es/crypto/aes/aes.mjs +0 -478
  173. package/dist/es/crypto/aes/index.d.ts +0 -16
  174. package/dist/es/crypto/aes/index.mjs +0 -24
  175. package/dist/es/crypto/base32/base32.d.ts +0 -3
  176. package/dist/es/crypto/base32/base32.mjs +0 -353
  177. package/dist/es/crypto/base32/index.d.ts +0 -24
  178. package/dist/es/crypto/base32/index.mjs +0 -36
  179. package/dist/es/crypto/des/des.d.ts +0 -52
  180. package/dist/es/crypto/des/des.mjs +0 -255
  181. package/dist/es/crypto/des/index.d.ts +0 -14
  182. package/dist/es/crypto/des/index.mjs +0 -25
  183. package/dist/es/crypto/sha/index.d.ts +0 -4
  184. package/dist/es/crypto/sha/sha1/index.d.ts +0 -13
  185. package/dist/es/crypto/sha/sha1/index.mjs +0 -21
  186. package/dist/es/crypto/sha/sha1/sha1.d.ts +0 -2
  187. package/dist/es/crypto/sha/sha1/sha1.mjs +0 -526
  188. package/dist/es/crypto/sha/sha256/index.d.ts +0 -26
  189. package/dist/es/crypto/sha/sha256/index.mjs +0 -38
  190. package/dist/es/crypto/sha/sha256/sha256.d.ts +0 -4
  191. package/dist/es/crypto/sha/sha256/sha256.mjs +0 -590
  192. package/dist/es/crypto/sha/sha3/index.d.ts +0 -24
  193. package/dist/es/crypto/sha/sha3/index.mjs +0 -36
  194. package/dist/es/crypto/sha/sha3/sha3.d.ts +0 -4
  195. package/dist/es/crypto/sha/sha3/sha3.mjs +0 -619
  196. package/dist/es/crypto/sha/sha512/index.d.ts +0 -52
  197. package/dist/es/crypto/sha/sha512/index.mjs +0 -72
  198. package/dist/es/crypto/sha/sha512/sha512.d.ts +0 -8
  199. package/dist/es/crypto/sha/sha512/sha512.mjs +0 -941
  200. package/dist/es/crypto/sm/index.d.ts +0 -3
  201. package/dist/es/crypto/sm/lib/asn1.d.ts +0 -12
  202. package/dist/es/crypto/sm/lib/asn1.mjs +0 -146
  203. package/dist/es/crypto/sm/lib/ec.d.ts +0 -126
  204. package/dist/es/crypto/sm/lib/ec.mjs +0 -312
  205. package/dist/es/crypto/sm/lib/jsbn.d.ts +0 -198
  206. package/dist/es/crypto/sm/lib/jsbn.mjs +0 -1605
  207. package/dist/es/crypto/sm/lib/sm3.d.ts +0 -5
  208. package/dist/es/crypto/sm/lib/sm3.mjs +0 -155
  209. package/dist/es/crypto/sm/lib/utils.d.ts +0 -53
  210. package/dist/es/crypto/sm/lib/utils.mjs +0 -158
  211. package/dist/es/crypto/sm/sm2/index.d.ts +0 -71
  212. package/dist/es/crypto/sm/sm2/index.mjs +0 -101
  213. package/dist/es/crypto/sm/sm2/sm2.d.ts +0 -34
  214. package/dist/es/crypto/sm/sm2/sm2.mjs +0 -220
  215. package/dist/es/crypto/sm/sm3/index.d.ts +0 -7
  216. package/dist/es/crypto/sm/sm3/index.mjs +0 -13
  217. package/dist/es/crypto/sm/sm3/sm3.d.ts +0 -1
  218. package/dist/es/crypto/sm/sm3/sm3.mjs +0 -91
  219. package/dist/es/crypto/sm/sm4/index.d.ts +0 -16
  220. package/dist/es/crypto/sm/sm4/index.mjs +0 -24
  221. package/dist/es/crypto/sm/sm4/sm4.d.ts +0 -2
  222. package/dist/es/crypto/sm/sm4/sm4.mjs +0 -324
  223. package/dist/es/crypto/tea/index.d.ts +0 -14
  224. package/dist/es/crypto/tea/index.mjs +0 -22
  225. package/dist/es/crypto/tea/tea.d.ts +0 -69
  226. package/dist/es/crypto/tea/tea.mjs +0 -185
  227. package/dist/es/weapp/index.d.ts +0 -57
  228. package/dist/es/weapp/index.mjs +0 -131
@@ -1,82 +1,105 @@
1
- import { isNull, isString, isDate, isInteger } from '../validate/index.mjs';
1
+ import { isNull, isString, isInteger, isDate } from '../validate/index.mjs';
2
2
  import { parseInt } from '../number/index.mjs';
3
3
  import { DATE } from '../constants/date.mjs';
4
4
 
5
+ /**
6
+ * @module 日期
7
+ */
5
8
  /* 快捷日期 */
6
9
  /**
7
10
  * 今天
8
- *@returns {String} 返回日期字符串
11
+ *@returns {string} 返回日期字符串
9
12
  */
10
13
  function today() {
11
14
  return getDate();
12
15
  }
13
16
  /**
14
17
  * 昨天
15
- * @returns {String} 返回日期字符串
18
+ * @returns {string} 返回日期字符串
16
19
  */
17
20
  function yesterday() {
18
- return formatDate(addDate(new Date(), -1));
21
+ return toDateString(addDate(new Date(), -1));
19
22
  }
20
23
  /**
21
24
  * 明天
22
- *@returns {String} 返回日期字符串
25
+ *@returns {string} 返回日期字符串
23
26
  */
24
27
  function tomorrow() {
25
- return formatDate(addDate(new Date(), 1));
28
+ return toDateString(addDate(new Date(), 1));
26
29
  }
27
30
  /**
28
31
  * 上周(7天前日期)
29
32
  * @param {Date} date 日期参数,默认当前日期
30
- * @returns {String} 返回日期字符串
33
+ * @returns {string} 返回日期字符串
31
34
  */
32
35
  function lastWeek(date = new Date()) {
33
- return formatDate(addDate(date, -7));
36
+ return toDateString(addDate(date, -7));
34
37
  }
35
38
  /**
36
39
  * 下周(7天后日期)
37
40
  * @param {Date} date 日期参数,默认当前日期
38
- * @returns {String} 返回日期字符串
41
+ * @returns {string} 返回日期字符串
39
42
  */
40
43
  function nextWeek(date = new Date()) {
41
- return formatDate(addDate(date, 7));
44
+ return toDateString(addDate(date, 7));
42
45
  }
43
46
  /**
44
47
  * 上个月(30天前日期)
45
48
  * @param {Date} date 日期参数,默认当前日期
46
- * @returns {String} 返回日期字符串
49
+ * @returns {string} 返回日期字符串
47
50
  */
48
51
  function lastMonth(date = new Date()) {
49
- return formatDate(addDate(date, -30));
52
+ const newDate = addMonth(date, -1);
53
+ // 处理跨月边界
54
+ if (newDate.getMonth() === date.getMonth()) {
55
+ newDate.setDate(0);
56
+ }
57
+ return toDateString(newDate);
50
58
  }
51
59
  /**
52
60
  * 下个月(30天后日期)
53
61
  * @param {Date} date 日期参数,默认当前日期
54
- * @returns {String} 返回日期字符串
62
+ * @returns {string} 返回日期字符串
55
63
  */
56
64
  function nextMonth(date = new Date()) {
57
- return formatDate(addDate(date, 30));
65
+ const newDate = addMonth(date, 1);
66
+ // 处理跨月边界
67
+ if (newDate.getMonth() === date.getMonth()) {
68
+ newDate.setDate(0);
69
+ }
70
+ return toDateString(newDate);
58
71
  }
59
72
  /**
60
73
  * 上一年(365天前日期)
61
74
  * @param {Date} date 日期参数,默认当前日期
62
- * @returns {String} 返回日期字符串
75
+ * @returns {string} 返回日期字符串
63
76
  */
64
77
  function lastYear(date = new Date()) {
65
- return formatDate(addDate(date, -365));
78
+ const newDate = addYear(date, -1);
79
+ // 处理跨年边界,闰年2月29日→平年2月28日
80
+ if (newDate.getMonth() !== date.getMonth() || newDate.getDate() !== date.getDate()) {
81
+ newDate.setDate(28);
82
+ }
83
+ return toDateString(newDate);
66
84
  }
67
85
  /**
68
86
  * 下一年(365天后日期)
69
87
  * @param {Date} date 日期参数,默认当前日期
70
- * @returns {String} 返回日期字符串
88
+ * @returns {string} 返回日期字符串
71
89
  */
72
90
  function nextYear(date = new Date()) {
73
- return formatDate(addDate(date, 365));
91
+ const newDate = addYear(date, 1);
92
+ // 处理跨年边界,闰年2月29日→平年2月28日
93
+ if (newDate.getMonth() !== date.getMonth() || newDate.getDate() !== date.getDate()) {
94
+ newDate.setDate(28);
95
+ }
96
+ return toDateString(newDate);
74
97
  }
75
98
  /* 判断当前日期 */
76
99
  /**
77
100
  * 是否为上午
78
101
  * @param {Date} date 日期参数,默认当前日期
79
- * @returns {Boolean} 返回结果
102
+ * @returns {boolean} 返回结果
80
103
  */
81
104
  function isAM(date = new Date()) {
82
105
  return date.getHours() < 12;
@@ -84,7 +107,7 @@ function isAM(date = new Date()) {
84
107
  /**
85
108
  * 是否为下午
86
109
  * @param {Date} date 日期参数,默认当前日期
87
- * @returns {Boolean} 返回结果
110
+ * @returns {boolean} 返回结果
88
111
  */
89
112
  function isPM(date = new Date()) {
90
113
  return date.getHours() >= 12;
@@ -92,88 +115,88 @@ function isPM(date = new Date()) {
92
115
  /**
93
116
  * 是否为今天
94
117
  * @param {Date} date 日期参数,默认当前日期
95
- * @returns {Boolean} 返回结果
118
+ * @returns {boolean} 返回结果
96
119
  */
97
120
  function isToday(date = new Date()) {
98
121
  // 此刻日期
99
- let nowDate = new Date();
122
+ const nowDate = new Date();
100
123
  // 判断日期
101
- return ["getFullYear", "getMonth", "getDate"].every((i) => nowDate[i]() === date[i]());
124
+ return ["getFullYear", "getMonth", "getDate"].every((item) => nowDate[item]() === date[item]());
102
125
  }
103
126
  /**
104
127
  * 是否为昨天
105
128
  * @param {Date} date 日期参数,默认当前日期
106
- * @returns {Boolean} 返回结果
129
+ * @returns {boolean} 返回结果
107
130
  */
108
131
  function isYesterday(date = new Date()) {
109
132
  // 计算时间差
110
- let startTime = date.getTime();
111
- let nowTime = Date.now();
112
- let diffTime = nowTime - startTime;
113
- let diffDay = parseInt(diffTime / (1000 * 60 * 60 * 24));
133
+ const startTime = date.getTime();
134
+ const nowTime = Date.now();
135
+ const diffTime = nowTime - startTime;
136
+ const diffDay = parseInt(diffTime / (1000 * 60 * 60 * 24));
114
137
  return diffDay === 1;
115
138
  }
116
139
  /**
117
140
  * 是否为前天
118
141
  * @param {Date} date 日期参数,默认当前日期
119
- * @returns {Boolean} 返回结果
142
+ * @returns {boolean} 返回结果
120
143
  */
121
144
  function isBeforeYesterday(date = new Date()) {
122
145
  // 计算时间差
123
- let startTime = date.getTime();
124
- let nowTime = Date.now();
125
- let diffTime = nowTime - startTime;
126
- let diffDay = parseInt(diffTime / (1000 * 60 * 60 * 24));
146
+ const startTime = date.getTime();
147
+ const nowTime = Date.now();
148
+ const diffTime = nowTime - startTime;
149
+ const diffDay = parseInt(diffTime / (1000 * 60 * 60 * 24));
127
150
  return diffDay === 2;
128
151
  }
129
152
  /**
130
153
  * 是否为明天
131
154
  * @param {Date} date 日期参数,默认当前日期
132
- * @returns {Boolean} 返回结果
155
+ * @returns {boolean} 返回结果
133
156
  */
134
157
  function isTomorrow(date = new Date()) {
135
158
  // 计算时间差
136
- let startTime = date.getTime();
137
- let nowTime = Date.now();
138
- let diffTime = startTime - nowTime;
139
- let diffDay = parseInt(diffTime / (1000 * 60 * 60 * 24));
159
+ const startTime = date.getTime();
160
+ const nowTime = Date.now();
161
+ const diffTime = startTime - nowTime;
162
+ const diffDay = parseInt(diffTime / (1000 * 60 * 60 * 24));
140
163
  return diffDay === 1;
141
164
  }
142
165
  /**
143
166
  * 是否为后天
144
167
  * @param {Date} date 日期参数,默认当前日期
145
- * @returns {Boolean} 返回结果
168
+ * @returns {boolean} 返回结果
146
169
  */
147
170
  function isAfterTomorrow(date = new Date()) {
148
171
  // 计算时间差
149
- let startTime = date.getTime();
150
- let nowTime = Date.now();
151
- let time = startTime - nowTime;
152
- let diffDay = parseInt(time / (1000 * 60 * 60 * 24));
172
+ const startTime = date.getTime();
173
+ const nowTime = Date.now();
174
+ const time = startTime - nowTime;
175
+ const diffDay = parseInt(time / (1000 * 60 * 60 * 24));
153
176
  return diffDay === 2;
154
177
  }
155
178
  /**
156
179
  * 是否为工作日
157
180
  * @param {Date} date 日期参数,默认当前日期
158
- * @returns {Boolean} 返回结果
181
+ * @returns {boolean} 返回结果
159
182
  */
160
183
  function isWorkday(date = new Date()) {
161
- let dayOfWeek = getDayOfWeek(date);
184
+ const dayOfWeek = getDayOfWeek(date);
162
185
  return dayOfWeek !== 6 && dayOfWeek !== 7;
163
186
  }
164
187
  /**
165
188
  * 是否为周末(周六和周日)
166
189
  * @param {Date} date 日期参数,默认当前日期
167
- * @returns {Boolean} 返回结果
190
+ * @returns {boolean} 返回结果
168
191
  */
169
192
  function isWeekend(date = new Date()) {
170
- let dayOfWeek = getDayOfWeek(date);
193
+ const dayOfWeek = getDayOfWeek(date);
171
194
  return dayOfWeek === 6 || dayOfWeek === 7;
172
195
  }
173
196
  /**
174
197
  * 是否为本周第一天
175
198
  * @param {Date} date 日期参数,默认当前日期
176
- * @returns {Boolean} 返回结果
199
+ * @returns {boolean} 返回结果
177
200
  */
178
201
  function isFirstDayOfWeek(date = new Date()) {
179
202
  return getDayOfWeek(date) === 1;
@@ -181,7 +204,7 @@ function isFirstDayOfWeek(date = new Date()) {
181
204
  /**
182
205
  * 是否为本周最后一天
183
206
  * @param {Date} date 日期参数,默认当前日期
184
- * @returns {Boolean} 返回结果
207
+ * @returns {boolean} 返回结果
185
208
  */
186
209
  function isLastDayOfWeek(date = new Date()) {
187
210
  return getDayOfWeek(date) === 7;
@@ -189,7 +212,7 @@ function isLastDayOfWeek(date = new Date()) {
189
212
  /**
190
213
  * 是否为本月第一天
191
214
  * @param {Date} date 日期参数,默认当前日期
192
- * @returns {Boolean} 返回结果
215
+ * @returns {boolean} 返回结果
193
216
  */
194
217
  function isFirstDayOfMonth(date = new Date()) {
195
218
  return getDayOfMonth(date) === 1;
@@ -197,7 +220,7 @@ function isFirstDayOfMonth(date = new Date()) {
197
220
  /**
198
221
  * 是否为本月最后一天
199
222
  * @param {Date} date 日期参数,默认当前日期
200
- * @returns {Boolean} 返回结果
223
+ * @returns {boolean} 返回结果
201
224
  */
202
225
  function isLastDayOfMonth(date = new Date()) {
203
226
  return getDayOfMonth(date) === getDaysOfMonth(date);
@@ -205,7 +228,7 @@ function isLastDayOfMonth(date = new Date()) {
205
228
  /**
206
229
  * 是否为本年第一天
207
230
  * @param {Date} date 日期参数,默认当前日期
208
- * @returns {Boolean} 返回结果
231
+ * @returns {boolean} 返回结果
209
232
  */
210
233
  function isFirstDayOfYear(date = new Date()) {
211
234
  return getDayOfYear(date) === 1;
@@ -213,7 +236,7 @@ function isFirstDayOfYear(date = new Date()) {
213
236
  /**
214
237
  * 是否为本年最后一天
215
238
  * @param {Date} date 日期参数,默认当前日期
216
- * @returns {Boolean} 返回结果
239
+ * @returns {boolean} 返回结果
217
240
  */
218
241
  function isLastDayOfYear(date = new Date()) {
219
242
  return getDayOfYear(date) === getDaysOfYear(date);
@@ -223,17 +246,17 @@ function isLastDayOfYear(date = new Date()) {
223
246
  * 是否为闰年
224
247
  * @description 闰年366天,平年365天
225
248
  * @param {Date} date 日期参数,默认当前日期
226
- * @returns {Boolean} 返回结果
249
+ * @returns {boolean} 返回结果
227
250
  */
228
251
  function isLeapYear(date = new Date()) {
229
- let year = date.getFullYear();
252
+ const year = date.getFullYear();
230
253
  return (year % 100 !== 0 && year % 4 === 0) || year % 400 === 0;
231
254
  }
232
255
  /**
233
256
  * 是否为平年
234
257
  * @description 闰年366天,平年365天
235
258
  * @param {Date} date 日期参数,默认当前日期
236
- * @returns {Boolean} 返回结果
259
+ * @returns {boolean} 返回结果
237
260
  */
238
261
  function isCommonYear(date = new Date()) {
239
262
  return !isLeapYear(date);
@@ -243,26 +266,26 @@ function isCommonYear(date = new Date()) {
243
266
  * 是否在日期之前
244
267
  * @param {Date} startDate 开始日期
245
268
  * @param {Date} endDate 结束日期,默认当前日期
246
- * @returns {Boolean} 返回结果
269
+ * @returns {boolean} 返回结果
247
270
  */
248
271
  function isBefore(startDate, endDate = new Date()) {
249
272
  // 计算时间差
250
- let startTime = startDate.getTime();
251
- let endTime = endDate.getTime();
252
- let diffTime = startTime - endTime;
273
+ const startTime = startDate.getTime();
274
+ const endTime = endDate.getTime();
275
+ const diffTime = startTime - endTime;
253
276
  return diffTime < 0;
254
277
  }
255
278
  /**
256
279
  * 是否在日期之后
257
280
  * @param {Date} startDate 开始日期
258
281
  * @param {Date} endDate 结束日期,默认当前日期
259
- * @returns {Boolean} 返回结果
282
+ * @returns {boolean} 返回结果
260
283
  */
261
284
  function isAfter(startDate, endDate = new Date()) {
262
285
  // 计算时间差
263
- let startTime = startDate.getTime();
264
- let endTime = endDate.getTime();
265
- let diffTime = startTime - endTime;
286
+ const startTime = startDate.getTime();
287
+ const endTime = endDate.getTime();
288
+ const diffTime = startTime - endTime;
266
289
  return diffTime > 0;
267
290
  }
268
291
  /**
@@ -270,12 +293,12 @@ function isAfter(startDate, endDate = new Date()) {
270
293
  * @param {Date} date 要比较的日期
271
294
  * @param {Date} startDate 开始日期
272
295
  * @param {Date} endDate 结束日期
273
- * @returns {Boolean} 返回结果
296
+ * @returns {boolean} 返回结果
274
297
  */
275
298
  function isBetween(date, startDate, endDate) {
276
- let time = date.getTime();
277
- let startTime = startDate.getTime();
278
- let endTime = endDate.getTime();
299
+ const time = date.getTime();
300
+ const startTime = startDate.getTime();
301
+ const endTime = endDate.getTime();
279
302
  return time > startTime && time < endTime;
280
303
  }
281
304
  /* 日期是否相同 */
@@ -283,46 +306,46 @@ function isBetween(date, startDate, endDate) {
283
306
  * 两个日期是否为同一天
284
307
  * @param {Date} startDate 开始日期
285
308
  * @param {Date} endDate 结束日期
286
- * @returns {Boolean} 返回结果
309
+ * @returns {boolean} 返回结果
287
310
  */
288
311
  function isSame(startDate, endDate) {
289
- return ["getFullYear", "getMonth", "getDate"].every((i) => startDate[i]() === endDate[i]());
312
+ return ["getFullYear", "getMonth", "getDate"].every((item) => startDate[item]() === endDate[item]());
290
313
  }
291
314
  /**
292
315
  * 两个日期是否为同一周
293
316
  * @param {Date} startDate 开始日期
294
317
  * @param {Date} endDate 结束日期
295
- * @returns {Boolean} 返回结果
318
+ * @returns {boolean} 返回结果
296
319
  */
297
320
  function isSameWeek(startDate, endDate) {
298
- let diffDate1 = startDate.getTime() / (24 * 60 * 60 * 1000);
299
- let diffDate2 = endDate.getTime() / (24 * 60 * 60 * 1000);
321
+ const diffDate1 = startDate.getTime() / (24 * 60 * 60 * 1000);
322
+ const diffDate2 = endDate.getTime() / (24 * 60 * 60 * 1000);
300
323
  return parseInt((diffDate1 + 4) / 7) === parseInt((diffDate2 + 4) / 7);
301
324
  }
302
325
  /**
303
326
  * 两个日期是否为同一个月
304
327
  * @param {Date} startDate 开始日期
305
328
  * @param {Date} endDate 结束日期
306
- * @returns {Boolean} 返回结果
329
+ * @returns {boolean} 返回结果
307
330
  */
308
331
  function isSameMonth(startDate, endDate) {
309
- return ["getFullYear", "getMonth"].every((i) => startDate[i]() === endDate[i]());
332
+ return ["getFullYear", "getMonth"].every((item) => startDate[item]() === endDate[item]());
310
333
  }
311
334
  /**
312
335
  * 两个日期是否为同一年
313
336
  * @param {Date} startDate 开始日期
314
337
  * @param {Date} endDate 结束日期
315
- * @returns {Boolean} 返回结果
338
+ * @returns {boolean} 返回结果
316
339
  */
317
340
  function isSameYear(startDate, endDate) {
318
- return ["getFullYear"].every((i) => startDate[i]() === endDate[i]());
341
+ return ["getFullYear"].every((item) => startDate[item]() === endDate[item]());
319
342
  }
320
343
  /* 比较两个日期相同 或 之前/之后 */
321
344
  /**
322
345
  * 两个日期是否相同或之前
323
346
  * @param {Date} startDate 开始日期
324
347
  * @param {Date} endDate 结束日期
325
- * @returns {Boolean} 返回结果
348
+ * @returns {boolean} 返回结果
326
349
  */
327
350
  function isSameOrBefore(startDate, endDate) {
328
351
  return isSame(startDate, endDate) || isBefore(startDate, endDate);
@@ -331,7 +354,7 @@ function isSameOrBefore(startDate, endDate) {
331
354
  * 两个日期是否相同或之后
332
355
  * @param {Date} startDate 开始日期
333
356
  * @param {Date} endDate 结束日期
334
- * @returns {Boolean} 返回结果
357
+ * @returns {boolean} 返回结果
335
358
  */
336
359
  function isSameOrAfter(startDate, endDate) {
337
360
  return isSame(startDate, endDate) || isAfter(startDate, endDate);
@@ -347,25 +370,27 @@ function getNow() {
347
370
  /**
348
371
  * 获得当前日期字符串
349
372
  * @param {Date} date 日期参数,默认当前日期
350
- * @param {String} format 日期字符串格式
351
- * @returns {String} 返回日期字符串
373
+ * @param options 配置项 配置项
374
+ * @returns {string} 返回日期字符串
352
375
  */
353
- function getDate(date = new Date(), format = "yyyy-MM-dd") {
354
- return formatDate(date, format);
376
+ function getDate(date = new Date(), options = { format: "yyyy-MM-dd" }) {
377
+ const { format } = options;
378
+ return toDateString(date, { format });
355
379
  }
356
380
  /**
357
381
  * 获得当前日期时间字符串
358
382
  * @param {Date} date 日期参数,默认当前日期
359
- * @param {String} format 日期时间字符串格式
360
- * @returns {String} 返回日期时间字符串
383
+ * @param options 配置项 配置项
384
+ * @returns {string} 返回日期时间字符串
361
385
  */
362
- function getDateTime(date = new Date(), format = "yyyy-MM-dd HH:mm:ss") {
363
- return formatDate(date, format);
386
+ function getDateTime(date = new Date(), options = { format: "yyyy-MM-dd HH:mm:ss" }) {
387
+ const { format } = options;
388
+ return toDateString(date, { format });
364
389
  }
365
390
  /**
366
391
  * 获取当前时间戳
367
392
  * @param {Date} date 日期参数,默认当前日期
368
- * @returns {Number} 返回时间戳
393
+ * @returns {number} 返回时间戳
369
394
  */
370
395
  function getTimestamp(date = new Date()) {
371
396
  return date.getTime();
@@ -373,10 +398,10 @@ function getTimestamp(date = new Date()) {
373
398
  /**
374
399
  * 获取当前Unix时间戳
375
400
  * @param {Date} date 日期参数,默认当前日期
376
- * @returns {Number} 返回Unix时间戳
401
+ * @returns {number} 返回Unix时间戳
377
402
  */
378
403
  function getUnixTimestamp(date = new Date()) {
379
- return Math.round(date / 1000);
404
+ return Math.round(date.getTime() / 1000);
380
405
  }
381
406
  /**
382
407
  * 获得当前日期的对象形式
@@ -405,11 +430,11 @@ function getDateArray(date = new Date()) {
405
430
  /**
406
431
  * 获得当前日期是周几
407
432
  * @param {Date} date 日期参数,默认当前日期
408
- * @param {String} format 周格式化结果:E:如“日”,EE:如“周日”, EEE:如“星期日”;默认为E,为空则返回数字
409
- * @param {String} lang 语言zh和en,默认zh
410
- * @returns {Number,String} 返回周几,会根据语言返回
433
+ * @param options 配置项
434
+ * @returns {number|string} 返回周几,会根据语言返回
411
435
  */
412
- function getWeek(date = new Date(), format = "E", lang = "zh") {
436
+ function getWeek(date = new Date(), options = { format: "E", lang: "zh" }) {
437
+ const { format, lang = "zh" } = options;
413
438
  // 根据格式化和语言返回对应的周
414
439
  if (format === "E") {
415
440
  return DATE.WEEK[lang].MINI[date.getDay()];
@@ -427,13 +452,13 @@ function getWeek(date = new Date(), format = "E", lang = "zh") {
427
452
  /**
428
453
  * 获得当前日期是第几季度
429
454
  * @param {Date} date 日期参数,默认当前日期
430
- * @param {String} format 季度格式化结果:Q:如“一”, QQ:如“一季度”;QQQ:如“第一季度”;默认为Q,为空则返回数字
431
- * @param {String} lang 语言zh和en,默认zh
432
- * @returns {Number,String} 返回第几季度,会根据语言返回
455
+ * @param options 配置项
456
+ * @returns {number|string} 返回第几季度,会根据语言返回
433
457
  */
434
- function getQuarter(date = new Date(), format = "Q", lang = "zh") {
458
+ function getQuarter(date = new Date(), options = { format: "Q", lang: "zh" }) {
459
+ const { format, lang = "zh" } = options;
435
460
  // 根据格式化和语言返回对应的周
436
- let quarterNum = Number(Math.floor((date.getMonth() + 3) / 3));
461
+ const quarterNum = Number(Math.floor((date.getMonth() + 3) / 3));
437
462
  if (format === "Q") {
438
463
  return DATE.QUARTER[lang].MINI[quarterNum - 1];
439
464
  }
@@ -451,7 +476,7 @@ function getQuarter(date = new Date(), format = "Q", lang = "zh") {
451
476
  /**
452
477
  * 获得当前日期是所在周的第几天
453
478
  * @param {Date} date 日期参数,默认当前日期
454
- * @returns {Number|String} 返回天数
479
+ * @returns {number|string} 返回天数
455
480
  */
456
481
  function getDayOfWeek(date = new Date()) {
457
482
  return [7, 1, 2, 3, 4, 5, 6][date.getDay()];
@@ -459,7 +484,7 @@ function getDayOfWeek(date = new Date()) {
459
484
  /**
460
485
  * 获得当前日期是所在月的第几天
461
486
  * @param {Date} date 日期参数,默认当前日期
462
- * @returns {Number} 返回天数
487
+ * @returns {number} 返回天数
463
488
  */
464
489
  function getDayOfMonth(date = new Date()) {
465
490
  return date.getDate();
@@ -467,44 +492,43 @@ function getDayOfMonth(date = new Date()) {
467
492
  /**
468
493
  * 获得当前日期是所在年的第几天
469
494
  * @param {Date} date 日期参数,默认当前日期
470
- * @returns {Number} 返回天数
495
+ * @returns {number} 返回天数
471
496
  */
472
497
  function getDayOfYear(date = new Date()) {
473
- return Math.ceil((date - new Date(date.getFullYear().toString())) / (24 * 60 * 60 * 1000)) + 1;
498
+ return Math.ceil((date.getTime() - new Date(date.getFullYear().toString()).getTime()) / (24 * 60 * 60 * 1000)) + 1;
474
499
  }
475
500
  /* 当前日期的周是所在 月/年 的第几周 */
476
501
  /**
477
502
  * 获得当前日期是所在月的第几周
478
503
  * @param {Date} date 日期参数,默认当前日期
479
- * @returns {Number} 返回周数
504
+ * @returns {number} 返回周数
480
505
  */
481
506
  function getWeekOfMonth(date = new Date()) {
482
- return Math.ceil((date.getDate() + 6 - getDayOfWeek(date)) / 7);
507
+ return Math.ceil((date.getDate() + 6 - Number(getDayOfWeek(date))) / 7);
483
508
  }
484
509
  /**
485
510
  * 获得当前日期是所在年的第几周
486
511
  * @param {Date} date 日期参数,默认当前日期
487
- * @returns {Number} 返回周数
512
+ * @returns {number} 返回周数
488
513
  */
489
514
  function getWeekOfYear(date = new Date()) {
490
- let startDate = new Date(date.getFullYear(), 0, 1);
491
- let startDay = getDayOfWeek(startDate);
492
- let diff = Math.round((date - startDate) / (24 * 60 * 60 * 1000));
493
- return Math.ceil((diff + startDay) / 7);
515
+ const startDate = new Date(date.getFullYear(), 0, 1);
516
+ const startDay = getDayOfWeek(startDate);
517
+ const diff = Math.round((date.getTime() - startDate.getTime()) / (24 * 60 * 60 * 1000));
518
+ return Math.ceil((diff + Number(startDay)) / 7);
494
519
  }
495
520
  /* 当前日期所在 周/月/年 共几天 */
496
521
  /**
497
522
  * 获得当前日期所在的周共几天
498
- * @param {Date} date 日期参数,默认当前日期
499
- * @returns {Number} 返回天数
523
+ * @returns {number} 返回天数
500
524
  */
501
- function getDaysOfWeek(date = new Date()) {
525
+ function getDaysOfWeek() {
502
526
  return 7;
503
527
  }
504
528
  /**
505
529
  * 获得当前日期所在的月共几天
506
530
  * @param {Date} date 日期参数,默认当前日期
507
- * @returns {Number} 返回天数
531
+ * @returns {number} 返回天数
508
532
  */
509
533
  function getDaysOfMonth(date = new Date()) {
510
534
  return new Date(date.getFullYear(), date.getMonth() + 1, 0).getDate();
@@ -512,7 +536,7 @@ function getDaysOfMonth(date = new Date()) {
512
536
  /**
513
537
  * 获得当前日期所在的年共几天
514
538
  * @param {Date} date 日期参数,默认当前日期
515
- * @returns {Number} 返回天数
539
+ * @returns {number} 返回天数
516
540
  */
517
541
  function getDaysOfYear(date = new Date()) {
518
542
  return isLeapYear(date) ? 366 : 365;
@@ -521,12 +545,12 @@ function getDaysOfYear(date = new Date()) {
521
545
  /**
522
546
  * 获得当前日期是所在月的第几周
523
547
  * @param {Date} date 日期参数,默认当前日期
524
- * @returns {Number} 返回周数
548
+ * @returns {number} 返回周数
525
549
  */
526
550
  function getWeeksOfMonth(date = new Date()) {
527
- let startDate = new Date(date.getFullYear(), 0, 1);
528
- let startDay = getDayOfWeek(startDate);
529
- let fullDays = isLeapYear(date) ? 366 : 365;
551
+ const startDate = new Date(date.getFullYear(), 0, 1);
552
+ const startDay = Number(getDayOfWeek(startDate));
553
+ const fullDays = isLeapYear(date) ? 366 : 365;
530
554
  if (startDay === 1) {
531
555
  return Math.ceil(fullDays / 7);
532
556
  }
@@ -537,12 +561,12 @@ function getWeeksOfMonth(date = new Date()) {
537
561
  /**
538
562
  * 获得当前日期是所在年的第几周
539
563
  * @param {Date} date 日期参数,默认当前日期
540
- * @returns {Number} 返回周数
564
+ * @returns {number} 返回周数
541
565
  */
542
566
  function getWeeksOfYear(date = new Date()) {
543
- let startDate = new Date(date.getFullYear(), 0, 1);
544
- let startDay = getDayOfWeek(startDate);
545
- let fullDays = isLeapYear(date) ? 366 : 365;
567
+ const startDate = new Date(date.getFullYear(), 0, 1);
568
+ const startDay = Number(getDayOfWeek(startDate));
569
+ const fullDays = isLeapYear(date) ? 366 : 365;
546
570
  if (startDay === 1) {
547
571
  return Math.ceil(fullDays / 7);
548
572
  }
@@ -554,101 +578,111 @@ function getWeeksOfYear(date = new Date()) {
554
578
  /**
555
579
  * 获得当前日期所在周的第一天
556
580
  * @param {Date} date 日期参数,默认当前日期
557
- * @returns {String} 返回日期字符串
581
+ * @returns {string} 返回日期字符串
558
582
  */
559
583
  function getFirstDateOfWeek(date = new Date()) {
560
- let weekDay = getDayOfWeek(date);
584
+ const weekDay = Number(getDayOfWeek(date));
561
585
  date.setDate(date.getDate() - weekDay + 1);
562
- return formatDate(date);
586
+ return toDateString(date);
563
587
  }
564
588
  /**
565
589
  * 获得当前日期所在周的最后一天
566
590
  * @param {Date} date 日期参数,默认当前日期
567
- * @returns {String} 返回日期字符串
591
+ * @returns {string} 返回日期字符串
568
592
  */
569
593
  function getLastDateOfWeek(date = new Date()) {
570
- let weekDay = getDayOfWeek(date);
594
+ const weekDay = Number(getDayOfWeek(date));
571
595
  date.setDate(date.getDate() + (7 - weekDay));
572
- return formatDate(date);
596
+ return toDateString(date);
573
597
  }
574
598
  /**
575
599
  * 获取当前日期所在周的所有日期
600
+ * @param {Date} date 日期参数,默认当前日期
601
+ * @returns {string[]} 返回日期数组
576
602
  */
577
603
  function getFullDateOfWeek(date = new Date()) {
578
- let array = [];
604
+ const array = [];
579
605
  // 获得当前日期是本周几
580
- let dayOfWeek = date.getDay();
606
+ const dayOfWeek = date.getDay();
581
607
  // 根据当前日期获取本周一
582
- let firstDateOfWeek = new Date();
608
+ const firstDateOfWeek = new Date();
583
609
  firstDateOfWeek.setDate(date.getDate() - (dayOfWeek === 0 ? 6 : dayOfWeek - 1));
584
610
  // 遍历本周日期
585
611
  for (let i = 0; i < 7; i++) {
586
- let currentDate = new Date(firstDateOfWeek);
612
+ const currentDate = new Date(firstDateOfWeek);
587
613
  currentDate.setDate(currentDate.getDate() + i);
588
- array.push(formatDate(currentDate));
614
+ array.push(toDateString(currentDate));
589
615
  }
590
616
  return array;
591
617
  }
592
618
  /**
593
619
  * 获得当前日期所在月的第一天
594
620
  * @param {Date} date 日期参数,默认当前日期
595
- * @returns {String} 返回日期字符串
621
+ * @returns {string} 返回日期字符串
596
622
  */
597
623
  function getFirstDateOfMonth(date = new Date()) {
598
624
  date.setDate(1);
599
- return formatDate(date);
625
+ return toDateString(date);
600
626
  }
601
627
  /**
602
628
  * 获得当前日期所在月的最后一天
603
629
  * @param {Date} date 日期参数,默认当前日期
604
- * @returns {String} 返回日期字符串
630
+ * @returns {string} 返回日期字符串
605
631
  */
606
632
  function getLastDateOfMonth(date = new Date()) {
607
- return formatDate(new Date(date.getFullYear(), date.getMonth() + 1, 0));
633
+ return toDateString(new Date(date.getFullYear(), date.getMonth() + 1, 0));
608
634
  }
609
635
  /**
610
636
  * 获取当前日期所在月的所有日期
637
+ * @param {Date} date 日期参数,默认当前日期
638
+ * @returns {string[]} 返回日期数组
611
639
  */
612
640
  function getFullDateOfMonth(date = new Date()) {
613
- let array = [];
641
+ const array = [];
614
642
  // 获得本月第一天
615
- let firstDateOfMonth = new Date(date.getFullYear(), date.getMonth(), 1);
643
+ const firstDateOfMonth = new Date(date.getFullYear(), date.getMonth(), 1);
616
644
  // 获得本月最后一天
617
- let lastDateOfMonth = new Date(date.getFullYear(), date.getMonth() + 1, 0);
645
+ const lastDateOfMonth = new Date(date.getFullYear(), date.getMonth() + 1, 0);
618
646
  // 遍历本月日期
619
647
  for (let i = 0; i < lastDateOfMonth.getDate(); i++) {
620
- let currentDate = new Date(firstDateOfMonth);
648
+ const currentDate = new Date(firstDateOfMonth);
621
649
  currentDate.setDate(firstDateOfMonth.getDate() + i);
622
- array.push(currentDate);
650
+ array.push(toDateString(currentDate));
623
651
  }
624
652
  return array;
625
653
  }
626
654
  /**
627
655
  * 获取当前日期所在年的第一天
656
+ * @param {Date} date 日期参数,默认当前日期
657
+ * @returns {string} 返回日期字符串
628
658
  */
629
659
  function getFirstDateOfYear(date = new Date()) {
630
- return new Date(date.getFullYear(), 0, 1);
660
+ return toDateString(new Date(date.getFullYear(), 0, 1));
631
661
  }
632
662
  /**
633
663
  * 获取当前日期所在年的最后一天
664
+ * @param {Date} date 日期参数,默认当前日期
665
+ * @returns {string} 返回日期字符串
634
666
  */
635
667
  function getLastDateOfYear(date = new Date()) {
636
- return new Date(date.getFullYear(), 11, 31);
668
+ return toDateString(new Date(date.getFullYear(), 11, 31));
637
669
  }
638
670
  /**
639
671
  * 获取当前日期所在年的所有日期
672
+ * @param {Date} date 日期参数,默认当前日期
673
+ * @returns {string} 返回日期字符串
640
674
  */
641
675
  function getFullDateOfYear(date = new Date()) {
642
- let array = [];
676
+ const array = [];
643
677
  // 获得本年第一天
644
- let firstDateOfYear = new Date(date.getFullYear(), 0, 1);
678
+ const firstDateOfYear = new Date(date.getFullYear(), 0, 1);
645
679
  // 获得本年一共多少天
646
- let daysOfYear = getDaysOfYear();
680
+ const daysOfYear = getDaysOfYear();
647
681
  // 遍历本年日期
648
682
  for (let i = 0; i < daysOfYear; i++) {
649
- let currentDate = new Date(firstDateOfYear);
683
+ const currentDate = new Date(firstDateOfYear);
650
684
  currentDate.setDate(firstDateOfYear.getDate() + i);
651
- array.push(currentDate.toLocaleDateString());
685
+ array.push(toDateString(currentDate));
652
686
  }
653
687
  return array;
654
688
  }
@@ -657,12 +691,12 @@ function getFullDateOfYear(date = new Date()) {
657
691
  * 计算两个日期相差的天数,不满一天为0
658
692
  * @param {Date} startDate 开始日期
659
693
  * @param {Date} endDate 结束日期
660
- * @returns {Number} 返回两个日期相差的天数,结果为正数或者负数
694
+ * @returns {number} 返回两个日期相差的天数,结果为正数或者负数
661
695
  */
662
696
  function getDiffDay(startDate, endDate) {
663
697
  if (isNull(startDate) || isNull(endDate))
664
698
  return 0;
665
- let diff = (endDate - startDate) / (24 * 60 * 60 * 1000);
699
+ const diff = (endDate.getTime() - startDate.getTime()) / (24 * 60 * 60 * 1000);
666
700
  // 返回
667
701
  return diff >= 0 ? Math.abs(diff) : diff;
668
702
  }
@@ -670,12 +704,12 @@ function getDiffDay(startDate, endDate) {
670
704
  * 计算两个日期相差的周数,不满一周为0
671
705
  * @param {Date} startDate 开始日期
672
706
  * @param {Date} endDate 结束日期
673
- * @returns {Number} 返回两个日期相差的周数,结果为正数或者负数
707
+ * @returns {number} 返回两个日期相差的周数,结果为正数或者负数
674
708
  */
675
709
  function getDiffWeek(startDate, endDate) {
676
710
  if (isNull(startDate) || isNull(endDate))
677
711
  return 0;
678
- let diff = (endDate - startDate) / (7 * 24 * 60 * 60 * 1000);
712
+ const diff = (endDate.getTime() - startDate.getTime()) / (7 * 24 * 60 * 60 * 1000);
679
713
  // 返回
680
714
  return diff >= 0 ? Math.abs(diff) : diff;
681
715
  }
@@ -683,12 +717,12 @@ function getDiffWeek(startDate, endDate) {
683
717
  * 计算两个日期相差的月数,不满一月为0
684
718
  * @param {Date} startDate 开始日期
685
719
  * @param {Date} endDate 结束日期
686
- * @returns {Number} 返回两个日期相差的月数,结果为正数或者负数
720
+ * @returns {number} 返回两个日期相差的月数,结果为正数或者负数
687
721
  */
688
722
  function getDiffMonth(startDate, endDate) {
689
723
  if (isNull(startDate) || isNull(endDate))
690
724
  return 0;
691
- let diff = (startDate - endDate) / (30 * 24 * 60 * 60 * 1000);
725
+ const diff = (startDate.getTime() - endDate.getTime()) / (30 * 24 * 60 * 60 * 1000);
692
726
  // 返回
693
727
  return diff >= 0 ? Math.abs(diff) : diff;
694
728
  }
@@ -696,12 +730,12 @@ function getDiffMonth(startDate, endDate) {
696
730
  * 计算两个日期相差的年数,不满一年为0
697
731
  * @param {Date} startDate 开始日期
698
732
  * @param {Date} endDate 结束日期
699
- * @returns {Number} 返回两个日期相差的年数,结果为正数或者负数
733
+ * @returns {number} 返回两个日期相差的年数,结果为正数或者负数
700
734
  */
701
735
  function getDiffYear(startDate, endDate) {
702
736
  if (isNull(startDate) || isNull(endDate))
703
737
  return 0;
704
- let diff = (endDate - startDate) / (12 * 30 * 24 * 60 * 60 * 1000);
738
+ const diff = (endDate.getTime() - startDate.getTime()) / (12 * 30 * 24 * 60 * 60 * 1000);
705
739
  // 返回
706
740
  return diff >= 0 ? Math.abs(diff) : diff;
707
741
  }
@@ -716,9 +750,9 @@ function getBetweenDates(startDate, endDate) {
716
750
  if (isNull(startDate) || isNull(endDate))
717
751
  return [];
718
752
  // 计算
719
- let array = [];
720
- while (endDate - startDate >= 0) {
721
- let year = startDate.getFullYear(), month = _digit(startDate.getMonth() + 1), day = _digit(startDate.getDate());
753
+ const array = [];
754
+ while (endDate.getTime() - startDate.getTime() >= 0) {
755
+ const year = startDate.getFullYear(), month = _digit(startDate.getMonth() + 1), day = _digit(startDate.getDate());
722
756
  // 加入数组
723
757
  array.push(year + "-" + month + "-" + day);
724
758
  // 更新日期
@@ -737,22 +771,22 @@ function getBetweenMonths(startDate, endDate) {
737
771
  if (isNull(startDate) || isNull(endDate))
738
772
  return [];
739
773
  // 计算
740
- let array = [];
774
+ const array = [];
741
775
  // 获取时间对象
742
- let min = new Date();
743
- let max = new Date();
776
+ const min = new Date();
777
+ const max = new Date();
744
778
  // 设置起始时间
745
779
  min.setFullYear(startDate.getFullYear(), startDate.getMonth() + 1);
746
780
  // 设置结束时间
747
781
  max.setFullYear(endDate.getFullYear(), endDate.getMonth() + 1);
748
782
  // 复制一份起始时间对象
749
- let curr = min;
783
+ const curr = min;
750
784
  // 定义字符串
751
785
  let str = "";
752
786
  // 起始时间在结束时间之前
753
787
  while (curr <= max) {
754
788
  // 获取此时间的月份
755
- let month = curr.getMonth();
789
+ const month = curr.getMonth();
756
790
  // 如果月份为0,也就是代表12月份
757
791
  if (month === 0) {
758
792
  str = curr.getFullYear() - 1 + "-" + 12;
@@ -778,9 +812,9 @@ function getBetweenYears(startDate, endDate) {
778
812
  if (isNull(startDate) || isNull(endDate))
779
813
  return [];
780
814
  // 计算
781
- let array = [];
782
- while (endDate - startDate >= 0) {
783
- let year = startDate.getFullYear();
815
+ const array = [];
816
+ while (endDate.getTime() - startDate.getTime() >= 0) {
817
+ const year = startDate.getFullYear();
784
818
  // 加入数组
785
819
  array.push(year);
786
820
  // 更新日期
@@ -793,22 +827,23 @@ function getBetweenYears(startDate, endDate) {
793
827
  * 获得过去时间的字符串显示
794
828
  * @description 例如:刚刚,1分钟前,1小时前等
795
829
  * @param {Date} date 日期参数
796
- * @param {String} lang 语言zh和en,默认zh
797
- * @returns {String} 返回字符串
830
+ * @param options 配置项
831
+ * @returns {string} 返回字符串
798
832
  */
799
- function getPastTime(date, lang = "zh") {
833
+ function getPastTime(date, options = { lang: "zh" }) {
834
+ const { lang = "zh" } = options;
800
835
  if (isNull(date))
801
836
  return "--";
802
837
  // 计算时间差
803
- let startTime = date.getTime();
804
- let currentTime = Date.now();
805
- let time = currentTime - startTime;
838
+ const startTime = date.getTime();
839
+ const currentTime = Date.now();
840
+ const time = currentTime - startTime;
806
841
  // 年月日时分
807
- let year = parseInt(time / (1000 * 60 * 60 * 24 * 30 * 12));
808
- let month = parseInt(time / (1000 * 60 * 60 * 24 * 30));
809
- let day = parseInt(time / (1000 * 60 * 60 * 24));
810
- let hour = parseInt(time / (1000 * 60 * 60));
811
- let min = parseInt(time / (1000 * 60));
842
+ const year = parseInt(time / (1000 * 60 * 60 * 24 * 30 * 12));
843
+ const month = parseInt(time / (1000 * 60 * 60 * 24 * 30));
844
+ const day = parseInt(time / (1000 * 60 * 60 * 24));
845
+ const hour = parseInt(time / (1000 * 60 * 60));
846
+ const min = parseInt(time / (1000 * 60));
812
847
  // 返回结果
813
848
  if (year) {
814
849
  return year + DATE.PASS_TIME[lang].YEAR;
@@ -846,15 +881,16 @@ function getPastTime(date, lang = "zh") {
846
881
  * 获得剩余时间的字符串显示
847
882
  * @description 例如:1天10小时20分钟30秒
848
883
  * @param {Date} date 日期参数
849
- * @param {String} lang 语言zh和en,默认zh
850
- * @returns {String} 返回字符串
884
+ * @param options 配置项
885
+ * @returns {string} 返回字符串
851
886
  */
852
- function getOverTime(date, lang = "zh") {
887
+ function getOverTime(date, options = { lang: "zh" }) {
888
+ const { lang = "zh" } = options;
853
889
  if (isNull(date))
854
890
  return "--";
855
891
  // 计算
856
- let startDate = new Date(); // 开始时间
857
- let t = date.getTime() - startDate.getTime(); // 时间差
892
+ const startDate = new Date(); // 开始时间
893
+ const t = date.getTime() - startDate.getTime(); // 时间差
858
894
  let d = 0, h = 0, m = 0, s = 0;
859
895
  if (t >= 0) {
860
896
  d = Math.floor(t / 1000 / 3600 / 24);
@@ -868,23 +904,23 @@ function getOverTime(date, lang = "zh") {
868
904
  /**
869
905
  * 通过日期获得年龄
870
906
  * @param {Date} date 日期参数
871
- * @returns {Number} 返回周岁年龄
907
+ * @returns {number} 返回周岁年龄
872
908
  */
873
909
  function getAge(date) {
874
910
  let age = 0;
875
911
  // 传参日期
876
- let dateArray = formatDate(date).split("-");
877
- let birthYear = Number(dateArray[0]);
878
- let birthMonth = Number(dateArray[1]);
879
- let birthDay = Number(dateArray[2]);
912
+ const dateArray = toDateString(date).split("-");
913
+ const birthYear = Number(dateArray[0]);
914
+ const birthMonth = Number(dateArray[1]);
915
+ const birthDay = Number(dateArray[2]);
880
916
  // 当前的日期
881
- let nowDate = new Date();
882
- let nowYear = nowDate.getFullYear(), nowMonth = nowDate.getMonth() + 1, nowDay = nowDate.getDate();
917
+ const nowDate = new Date();
918
+ const nowYear = nowDate.getFullYear(), nowMonth = nowDate.getMonth() + 1, nowDay = nowDate.getDate();
883
919
  // 出生年份需要小于当年,否则是0岁
884
- let diffAge = nowYear - birthYear;
920
+ const diffAge = nowYear - birthYear;
885
921
  if (diffAge > 0) {
886
- let diffMonth = nowMonth - birthMonth;
887
- let diffDay = nowDay - birthDay;
922
+ const diffMonth = nowMonth - birthMonth;
923
+ const diffDay = nowDay - birthDay;
888
924
  if (diffMonth === 0) {
889
925
  if (diffDay < 0) {
890
926
  age = diffAge - 1;
@@ -908,29 +944,31 @@ function getAge(date) {
908
944
  /**
909
945
  * 通过日期获得星座
910
946
  * @param {Date} date 日期参数
911
- * @param {String} lang 语言zh和en,默认zh
912
- * @returns {String} 返回星座
947
+ * @param options 配置项
948
+ * @returns {string} 返回星座
913
949
  */
914
- function getZodiac(date, lang = "zh") {
950
+ function getZodiac(date, options = { lang: "zh" }) {
951
+ const { lang = "zh" } = options;
915
952
  if (isNull(date))
916
953
  return "";
917
954
  // 计算
918
- let days = [20, 19, 21, 20, 21, 22, 23, 23, 23, 24, 23, 22];
919
- let month = date.getMonth() + 1;
920
- let day = date.getDate();
955
+ const days = [20, 19, 21, 20, 21, 22, 23, 23, 23, 24, 23, 22];
956
+ const month = date.getMonth() + 1;
957
+ const day = date.getDate();
921
958
  return day < days[month - 1] ? DATE.ZODIAC[lang][month - 1] : DATE.ZODIAC[lang][month];
922
959
  }
923
960
  /**
924
961
  * 通过日期获得生肖
925
962
  * @param {Date} date 日期参数
926
- * @param {String} lang 语言zh和en,默认zh
927
- * @returns {String} 返回生肖
963
+ * @param options 配置项
964
+ * @returns {string} 返回生肖
928
965
  */
929
- function getChineseZodiac(date, lang = "zh") {
966
+ function getChineseZodiac(date, options = { lang: "zh" }) {
967
+ const { lang = "zh" } = options;
930
968
  if (isNull(date))
931
969
  return "";
932
970
  // 计算
933
- let year = date.getFullYear();
971
+ const year = date.getFullYear();
934
972
  if (year < 1900) {
935
973
  return "未知";
936
974
  }
@@ -940,7 +978,7 @@ function getChineseZodiac(date, lang = "zh") {
940
978
  /**
941
979
  * 日期加减年
942
980
  * @param {Date} date 日期参数,默认当前日期
943
- * @param {Number} num 加减数量,用正数和负数表示;默认+1
981
+ * @param {number} num 加减数量,用正数和负数表示;默认+1
944
982
  * @returns {Date} 返回加减后的日期
945
983
  */
946
984
  function addYear(date = new Date(), num = 1) {
@@ -950,7 +988,7 @@ function addYear(date = new Date(), num = 1) {
950
988
  /**
951
989
  * 日期加减月
952
990
  * @param {Date} date 日期参数,默认当前日期
953
- * @param {Number} num 加减数量,用正数和负数表示;默认+1
991
+ * @param {number} num 加减数量,用正数和负数表示;默认+1
954
992
  * @returns {Date} 返回加减后的日期
955
993
  */
956
994
  function addMonth(date = new Date(), num = 1) {
@@ -960,7 +998,7 @@ function addMonth(date = new Date(), num = 1) {
960
998
  /**
961
999
  * 日期加减天
962
1000
  * @param {Date} date 日期参数,默认当前日期
963
- * @param {Number} num 加减数量,用正数和负数表示;默认+1
1001
+ * @param {number} num 加减数量,用正数和负数表示;默认+1
964
1002
  * @returns {Date} 返回加减后的日期
965
1003
  */
966
1004
  function addDate(date = new Date(), num = 1) {
@@ -970,7 +1008,7 @@ function addDate(date = new Date(), num = 1) {
970
1008
  /**
971
1009
  * 日期加减小时
972
1010
  * @param {Date} date 日期参数,默认当前日期
973
- * @param {Number} num 加减数量,用正数和负数表示;默认+1
1011
+ * @param {number} num 加减数量,用正数和负数表示;默认+1
974
1012
  * @returns {Date} 返回加减后的日期
975
1013
  */
976
1014
  function addHours(date = new Date(), num = 1) {
@@ -980,7 +1018,7 @@ function addHours(date = new Date(), num = 1) {
980
1018
  /**
981
1019
  * 日期加减分钟
982
1020
  * @param {Date} date 日期参数,默认当前日期
983
- * @param {Number} num 加减数量,用正数和负数表示;默认+1
1021
+ * @param {number} num 加减数量,用正数和负数表示;默认+1
984
1022
  * @returns {Date} 返回加减后的日期
985
1023
  */
986
1024
  function addMinutes(date = new Date(), num = 1) {
@@ -990,7 +1028,7 @@ function addMinutes(date = new Date(), num = 1) {
990
1028
  /**
991
1029
  * 日期加减秒
992
1030
  * @param {Date} date 日期参数,默认当前日期
993
- * @param {Number} num 加减数量,用正数和负数表示;默认+1
1031
+ * @param {number} num 加减数量,用正数和负数表示;默认+1
994
1032
  * @returns {Date} 返回加减后的日期
995
1033
  */
996
1034
  function addSeconds(date = new Date(), num = 1) {
@@ -1000,7 +1038,7 @@ function addSeconds(date = new Date(), num = 1) {
1000
1038
  /**
1001
1039
  * 日期加减毫秒
1002
1040
  * @param {Date} date 日期参数,默认当前日期
1003
- * @param {Number} num 加减数量,用正数和负数表示;默认+100
1041
+ * @param {number} num 加减数量,用正数和负数表示;默认+100
1004
1042
  * @returns {Date} 返回加减后的日期
1005
1043
  */
1006
1044
  function addMillisecond(date = new Date(), num = 100) {
@@ -1010,7 +1048,7 @@ function addMillisecond(date = new Date(), num = 100) {
1010
1048
  /**
1011
1049
  * 日期加减周
1012
1050
  * @param {Date} date 日期参数,默认当前日期
1013
- * @param {Number} num 加减数量,用正数和负数表示;默认+1
1051
+ * @param {number} num 加减数量,用正数和负数表示;默认+1
1014
1052
  * @returns {Date} 返回加减后的日期
1015
1053
  */
1016
1054
  function addWeek(date = new Date(), num = 1) {
@@ -1020,7 +1058,7 @@ function addWeek(date = new Date(), num = 1) {
1020
1058
  /**
1021
1059
  * 日期加减季度
1022
1060
  * @param {Date} date 日期参数,默认当前日期
1023
- * @param {Number} num 加减数量,用正数和负数表示;默认+1
1061
+ * @param {number} num 加减数量,用正数和负数表示;默认+1
1024
1062
  * @returns {Date} 返回加减后的日期
1025
1063
  */
1026
1064
  function addQuarter(date = new Date(), num = 1) {
@@ -1029,151 +1067,190 @@ function addQuarter(date = new Date(), num = 1) {
1029
1067
  }
1030
1068
  /* 格式化和解析日期 */
1031
1069
  /**
1032
- * 日期对象转为日期字符串
1033
- * @description 支持日期字符串,日期对象,时间戳,unix时间戳
1034
- * @param {String|Date|Number} date 日期参数
1035
- * @param {String} format 转化格式
1036
- * @param {String} lang 语言zh和en,默认zh
1037
- * @returns {String} 返回日期字符串
1070
+ * UTC 日期对象转本地时区日期对象
1071
+ * @description 将 UTC 时间的 Date 对象转换为本地时间的 Date 对象(时间戳不变,仅调整时区偏移)
1072
+ * @param {Date} date UTC 日期对象,默认当前 UTC 时间
1073
+ * @returns {Date} 本地时区日期对象(时间戳 = UTC时间戳 + 时区偏移毫秒数)
1074
+ * @example
1075
+ * // UTC时间:2025-01-26 00:00:00
1076
+ * const utcDate = new Date('2025-01-26T00:00:00Z');
1077
+ * const localDate = fromDateUTC(utcDate);
1078
+ * console.log(toDateString(localDate)); // 2025-01-26 08:00:00(北京本地时间)
1038
1079
  */
1039
- // TODO:需要支持"20260109" 这种格式的日期的转换
1040
- function formatDate(date, format = "yyyy-MM-dd", lang = "zh") {
1041
- if (isNull(date))
1042
- return "";
1043
- // 是日期字符串
1044
- if (isString(date)) {
1045
- date = parseDate(date);
1046
- }
1047
- // 是日期对象
1048
- else if (isDate(date)) ;
1049
- // 是时间戳
1050
- else if (isInteger(date) && String(date).length === 13) {
1051
- date = new Date(date);
1052
- }
1053
- // 是unix时间戳
1054
- else if (isInteger(date) && String(date).length === 10) {
1055
- date = new Date(date * 1000);
1056
- }
1057
- // 不支持的日期格式
1058
- else {
1059
- console.error("Not supported date format!");
1060
- return date;
1061
- }
1062
- // 配置规则
1063
- let rules = {
1064
- "M+": date.getMonth() + 1, // 月份
1065
- "d+": date.getDate(), // 日
1066
- "h+": date.getHours() % 12 === 0 ? 12 : date.getHours() % 12, // 12小时制
1067
- "H+": date.getHours(), // 24小时制
1068
- "m+": date.getMinutes(), // 分钟
1069
- "s+": date.getSeconds(), // 秒
1070
- "S+": date.getMilliseconds(), // 毫秒
1071
- "a+": date.getHours() < 12 ? "am" : "pm", // 上午/下午,小写
1072
- "A+": date.getHours() < 12 ? "AM" : "PM", // 上午/下午,大写
1073
- "E+": date.getDay(), // 周
1074
- "Q+": Math.floor((date.getMonth() + 3) / 3), // 季度
1075
- S: date.getMilliseconds(), // 毫秒
1076
- };
1077
- // 年
1078
- let yearReg = new RegExp(/(y+)/g);
1079
- if (yearReg.test(format)) {
1080
- format = format.replace(yearReg, function (match, $1) {
1081
- return (date.getFullYear() + "").substring(4 - $1.length);
1082
- });
1083
- }
1084
- // 上午/下午
1085
- let amPmReg = new RegExp(/((b+)|(A+))/g);
1086
- if (amPmReg.test(format)) {
1087
- format = format.replace(amPmReg, function (match, $1) {
1088
- // AA或者aa为中文
1089
- if ($1.length > 1) {
1090
- return date.getHours() < 12 ? DATE.AM_PM[lang].AM : DATE.AM_PM[lang].PM;
1091
- }
1092
- // 其他为英文
1093
- else {
1094
- return $1 === $1.toLowerCase()
1095
- ? date.getHours() < 12
1096
- ? DATE.AM_PM["en"].AM.toLowerCase()
1097
- : DATE.AM_PM["en"].PM.toLowerCase()
1098
- : date.getHours() < 12
1099
- ? DATE.AM_PM["en"].AM
1100
- : DATE.AM_PM["en"].PM;
1101
- }
1102
- });
1103
- }
1104
- // 周
1105
- let weekReg = new RegExp(/(E+)/g);
1106
- if (weekReg.test(format)) {
1107
- format = format.replace(weekReg, function (match, $1) {
1108
- return $1.length === 1
1109
- ? DATE.WEEK[lang].MINI[date.getDay()]
1110
- : $1.length === 2
1111
- ? DATE.WEEK[lang].SHORT[date.getDay()]
1112
- : DATE.WEEK[lang].FULL[date.getDay()];
1113
- });
1114
- }
1115
- // 季度
1116
- let quarterReg = new RegExp(/(Q+)/g);
1117
- if (quarterReg.test(format)) {
1118
- format = format.replace(quarterReg, function (match, $1) {
1119
- return $1.length === 1
1120
- ? DATE.QUARTER[lang].MINI[Math.floor((date.getMonth() + 3) / 3) - 1]
1121
- : $1.length === 2
1122
- ? DATE.QUARTER[lang].SHORT[Math.floor((date.getMonth() + 3) / 3) - 1]
1123
- : DATE.QUARTER[lang].FULL[Math.floor((date.getMonth() + 3) / 3) - 1];
1124
- });
1125
- }
1126
- // 经过上面的过滤,剩余的日期参数处理
1127
- for (let k in rules) {
1128
- let dateReg = new RegExp("(" + k + ")");
1129
- if (dateReg.test(format)) {
1130
- format = format.replace(dateReg, function (match, $1) {
1131
- return $1.length === 1
1132
- ? rules[k]
1133
- : $1.length === 2
1134
- ? ("00" + rules[k]).substring(("" + rules[k]).length)
1135
- : ("000" + rules[k]).substring(("" + rules[k]).length);
1136
- });
1137
- }
1138
- }
1139
- return format;
1080
+ function fromDateUTC(date = new Date()) {
1081
+ return new Date(date.getTime() - date.getTimezoneOffset() * 60 * 1000);
1082
+ }
1083
+ /**
1084
+ * 本地时区日期转 UTC 日期对象
1085
+ * @description 将本地时间的 Date 对象转换为 UTC 时间的 Date 对象(时间戳不变,仅调整时区偏移)
1086
+ * @param {Date} date 本地日期对象,默认当前本地时间
1087
+ * @returns {Date} UTC 日期对象(时间戳 = 本地时间戳 - 时区偏移毫秒数)
1088
+ * @example
1089
+ * // 北京本地时间:2025-01-26 08:00:00(东8区)
1090
+ * const localDate = new Date('2025-01-26 08:00:00');
1091
+ * const utcDate = toDateUTC(localDate);
1092
+ * console.log(utcDate.toISOString()); // 2025-01-26T00:00:00.000Z(UTC时间)
1093
+ */
1094
+ function toDateUTC(date = new Date()) {
1095
+ return new Date(date.getTime() + date.getTimezoneOffset() * 60 * 1000);
1096
+ }
1097
+ /**
1098
+ * 格式化日期为 UTC 字符串(符合 ISO 8601 标准)
1099
+ * @description 直接输出 UTC 时间的字符串,无需手动转换时区
1100
+ * @param {Date} date 本地日期对象,默认当前本地时间
1101
+ * @param {DateOptions} options 格式化配置,默认 yyyy-MM-dd HH:mm:ss
1102
+ * @returns {string} UTC 日期字符串
1103
+ * @example
1104
+ * const localDate = new Date('2025-01-26 08:00:00');
1105
+ * console.log(toUTCString(localDate)); // 2025-01-26 00:00:00
1106
+ */
1107
+ function toDataUTCString(date = new Date(), options = { format: "yyyy-MM-dd HH:mm:ss" }) {
1108
+ const utcDate = toDateUTC(date);
1109
+ return toDateString(utcDate, options);
1140
1110
  }
1141
1111
  /**
1142
1112
  * 日期字符串转为日期对象
1143
1113
  * @description 支持日期字符串,时间戳,Unix时间戳
1144
- * @param {String|Number} value 日期参数
1114
+ * @param {string|number} value 日期参数
1145
1115
  * @returns {Date} 返回日期对象
1146
1116
  */
1147
- function parseDate(value) {
1117
+ function toDate(value) {
1148
1118
  if (isNull(value))
1149
- return null;
1150
- // 是日期字符串
1151
- if (isString(value)) {
1152
- return new Date(value.replace(/-/g, "/"));
1119
+ return;
1120
+ try {
1121
+ // 是日期字符串
1122
+ if (isString(value)) {
1123
+ return new Date(String(value).replace(/-/g, "/"));
1124
+ }
1125
+ // 是时间戳
1126
+ else if (isInteger(value) && String(value).length === 13) {
1127
+ return new Date(value);
1128
+ }
1129
+ // 是unix时间戳
1130
+ else if (isInteger(value) && String(value).length === 10) {
1131
+ return new Date(Number(value) * 1000);
1132
+ }
1133
+ // 不支持的日期格式
1134
+ else {
1135
+ console.error("Not supported date format!");
1136
+ return undefined;
1137
+ }
1153
1138
  }
1154
- // 是时间戳
1155
- else if (isInteger(value) && String(value).length === 13) {
1156
- return new Date(value);
1139
+ catch (e) {
1140
+ console.error("Parse to Date error", e);
1157
1141
  }
1158
- // 是unix时间戳
1159
- else if (isInteger(value) && String(value).length === 10) {
1160
- return new Date(value * 1000);
1142
+ }
1143
+ /**
1144
+ * 日期对象转为日期字符串
1145
+ * @description 支持日期字符串,日期对象,时间戳,unix时间戳
1146
+ * @param {Date} date 日期参数
1147
+ * @param options 配置项
1148
+ * @returns {string} 返回日期字符串
1149
+ */
1150
+ function toDateString(date, options = { format: "yyyy-MM-dd", lang: "zh" }) {
1151
+ const { format = "yyyy-MM-dd", lang = "zh" } = options;
1152
+ if (isNull(date))
1153
+ return "";
1154
+ try {
1155
+ // 判断是否是日期对象
1156
+ if (!isDate(date)) {
1157
+ console.error("Not a Date type!");
1158
+ return "";
1159
+ }
1160
+ // 日期转化替换
1161
+ const replaceRules = {
1162
+ // 年(yyyy/yy)
1163
+ "(y+)": (match) => {
1164
+ const year = date.getFullYear().toString();
1165
+ return match.length === 2 ? year.slice(-2) : year;
1166
+ },
1167
+ // 月(M/MM)
1168
+ "(M+)": (match) => {
1169
+ const month = date.getMonth() + 1;
1170
+ return match.length === 1 ? month.toString() : month.toString().padStart(2, "0");
1171
+ },
1172
+ // 日(d/dd)
1173
+ "(d+)": (match) => {
1174
+ const day = date.getDate();
1175
+ return match.length === 1 ? day.toString() : day.toString().padStart(2, "0");
1176
+ },
1177
+ // 12小时制(h/hh)
1178
+ "(h+)": (match) => {
1179
+ const hour = date.getHours() % 12 || 12;
1180
+ return match.length === 1 ? hour.toString() : hour.toString().padStart(2, "0");
1181
+ },
1182
+ // 24小时制(H/HH)
1183
+ "(H+)": (match) => {
1184
+ const hour = date.getHours();
1185
+ return match.length === 1 ? hour.toString() : hour.toString().padStart(2, "0");
1186
+ },
1187
+ // 分钟(m/mm)
1188
+ "(m+)": (match) => {
1189
+ const min = date.getMinutes();
1190
+ return match.length === 1 ? min.toString() : min.toString().padStart(2, "0");
1191
+ },
1192
+ // 秒(s/ss)
1193
+ "(s+)": (match) => {
1194
+ const sec = date.getSeconds();
1195
+ return match.length === 1 ? sec.toString() : sec.toString().padStart(2, "0");
1196
+ },
1197
+ // 毫秒(S/SS/SSS)
1198
+ "(S+)": (match) => {
1199
+ const ms = date.getMilliseconds();
1200
+ return ms.toString().padStart(match.length, "0").slice(0, match.length);
1201
+ },
1202
+ // 上午/下午(a/A/aa/AA)
1203
+ "([aA]+)": (match) => {
1204
+ const isAm = date.getHours() < 12;
1205
+ // 多语言处理
1206
+ if (match.length > 1) {
1207
+ return isAm ? DATE.AM_PM[lang].AM : DATE.AM_PM[lang].PM;
1208
+ }
1209
+ else {
1210
+ return isAm ? match.toLowerCase() : match.toUpperCase();
1211
+ }
1212
+ },
1213
+ // 周(E/EE/EEE)
1214
+ "(E+)": (match) => {
1215
+ const day = date.getDay();
1216
+ if (match.length === 1)
1217
+ return DATE.WEEK[lang].MINI[day];
1218
+ if (match.length === 2)
1219
+ return DATE.WEEK[lang].SHORT[day];
1220
+ return DATE.WEEK[lang].FULL[day];
1221
+ },
1222
+ // 季度(Q/QQ/QQQ)
1223
+ "(Q+)": (match) => {
1224
+ const quarter = Math.floor((date.getMonth() + 3) / 3) - 1;
1225
+ if (match.length === 1)
1226
+ return DATE.QUARTER[lang].MINI[quarter];
1227
+ if (match.length === 2)
1228
+ return DATE.QUARTER[lang].SHORT[quarter];
1229
+ return DATE.QUARTER[lang].FULL[quarter];
1230
+ },
1231
+ };
1232
+ // 批量替换格式
1233
+ let result = format;
1234
+ Object.entries(replaceRules).forEach(([regStr, replaceFn]) => {
1235
+ const reg = new RegExp(regStr, "g");
1236
+ result = result.replace(reg, (_, match) => replaceFn(match));
1237
+ });
1238
+ return result;
1161
1239
  }
1162
- // 不支持的日期格式
1163
- else {
1164
- console.error("Not supported date format!");
1165
- return value;
1240
+ catch (e) {
1241
+ console.error("Date to String error", e);
1242
+ return "";
1166
1243
  }
1167
1244
  }
1168
1245
  /* 内部使用的函数 */
1169
1246
  /**
1170
1247
  * 单个数字前自动补齐零为两位
1171
- * @param {String|Number} value 可以是数字和字符串
1172
- * @returns {String} 返回处理后的字符串
1248
+ * @param {string|number} value 可以是数字和字符串
1249
+ * @returns {string} 返回处理后的字符串
1173
1250
  */
1174
1251
  function _digit(value) {
1175
1252
  value = value.toString();
1176
1253
  return value[1] ? value : "0" + value;
1177
1254
  }
1178
1255
 
1179
- export { addDate, addHours, addMillisecond, addMinutes, addMonth, addQuarter, addSeconds, addWeek, addYear, formatDate, getAge, getBetweenDates, getBetweenMonths, getBetweenYears, getChineseZodiac, getDate, getDateArray, getDateObject, getDateTime, getDayOfMonth, getDayOfWeek, getDayOfYear, getDaysOfMonth, getDaysOfWeek, getDaysOfYear, getDiffDay, getDiffMonth, getDiffWeek, getDiffYear, getFirstDateOfMonth, getFirstDateOfWeek, getFirstDateOfYear, getFullDateOfMonth, getFullDateOfWeek, getFullDateOfYear, getLastDateOfMonth, getLastDateOfWeek, getLastDateOfYear, getNow, getOverTime, getPastTime, getQuarter, getTimestamp, getUnixTimestamp, getWeek, getWeekOfMonth, getWeekOfYear, getWeeksOfMonth, getWeeksOfYear, getZodiac, isAM, isAfter, isAfterTomorrow, isBefore, isBeforeYesterday, isBetween, isCommonYear, isFirstDayOfMonth, isFirstDayOfWeek, isFirstDayOfYear, isLastDayOfMonth, isLastDayOfWeek, isLastDayOfYear, isLeapYear, isPM, isSame, isSameMonth, isSameOrAfter, isSameOrBefore, isSameWeek, isSameYear, isToday, isTomorrow, isWeekend, isWorkday, isYesterday, lastMonth, lastWeek, lastYear, nextMonth, nextWeek, nextYear, parseDate, today, tomorrow, yesterday };
1256
+ export { addDate, addHours, addMillisecond, addMinutes, addMonth, addQuarter, addSeconds, addWeek, addYear, fromDateUTC, getAge, getBetweenDates, getBetweenMonths, getBetweenYears, getChineseZodiac, getDate, getDateArray, getDateObject, getDateTime, getDayOfMonth, getDayOfWeek, getDayOfYear, getDaysOfMonth, getDaysOfWeek, getDaysOfYear, getDiffDay, getDiffMonth, getDiffWeek, getDiffYear, getFirstDateOfMonth, getFirstDateOfWeek, getFirstDateOfYear, getFullDateOfMonth, getFullDateOfWeek, getFullDateOfYear, getLastDateOfMonth, getLastDateOfWeek, getLastDateOfYear, getNow, getOverTime, getPastTime, getQuarter, getTimestamp, getUnixTimestamp, getWeek, getWeekOfMonth, getWeekOfYear, getWeeksOfMonth, getWeeksOfYear, getZodiac, isAM, isAfter, isAfterTomorrow, isBefore, isBeforeYesterday, isBetween, isCommonYear, isFirstDayOfMonth, isFirstDayOfWeek, isFirstDayOfYear, isLastDayOfMonth, isLastDayOfWeek, isLastDayOfYear, isLeapYear, isPM, isSame, isSameMonth, isSameOrAfter, isSameOrBefore, isSameWeek, isSameYear, isToday, isTomorrow, isWeekend, isWorkday, isYesterday, lastMonth, lastWeek, lastYear, nextMonth, nextWeek, nextYear, toDataUTCString, toDate, toDateString, toDateUTC, today, tomorrow, yesterday };