潘志宝
2024-09-18 6d9c089cebac440c78573e9fa95190ee9ead674c
提交 | 用户 | 时间
820397 1 import dayjs from 'dayjs'
H 2 import type { TableColumnCtx } from 'element-plus'
3
4 /**
5  * 日期快捷选项适用于 el-date-picker
6  */
7 export const defaultShortcuts = [
8   {
9     text: '今天',
10     value: () => {
11       return new Date()
12     }
13   },
14   {
15     text: '昨天',
16     value: () => {
17       const date = new Date()
18       date.setTime(date.getTime() - 3600 * 1000 * 24)
19       return [date, date]
20     }
21   },
22   {
23     text: '最近七天',
24     value: () => {
25       const date = new Date()
26       date.setTime(date.getTime() - 3600 * 1000 * 24 * 7)
27       return [date, new Date()]
28     }
29   },
30   {
31     text: '最近 30 天',
32     value: () => {
33       const date = new Date()
34       date.setTime(date.getTime() - 3600 * 1000 * 24 * 30)
35       return [date, new Date()]
36     }
37   },
38   {
39     text: '本月',
40     value: () => {
41       const date = new Date()
42       date.setDate(1) // 设置为当前月的第一天
43       return [date, new Date()]
44     }
45   },
46   {
47     text: '今年',
48     value: () => {
49       const date = new Date()
50       return [new Date(`${date.getFullYear()}-01-01`), date]
51     }
52   }
53 ]
54
55 /**
56  * 时间日期转换
57  * @param date 当前时间,new Date() 格式
58  * @param format 需要转换的时间格式字符串
59  * @description format 字符串随意,如 `YYYY-mm、YYYY-mm-dd`
60  * @description format 季度:"YYYY-mm-dd HH:MM:SS QQQQ"
61  * @description format 星期:"YYYY-mm-dd HH:MM:SS WWW"
62  * @description format 几周:"YYYY-mm-dd HH:MM:SS ZZZ"
63  * @description format 季度 + 星期 + 几周:"YYYY-mm-dd HH:MM:SS WWW QQQQ ZZZ"
64  * @returns 返回拼接后的时间字符串
65  */
66 export function formatDate(date: Date, format?: string): string {
67   // 日期不存在,则返回空
68   if (!date) {
69     return ''
70   }
71   // 日期存在,则进行格式化
72   return date ? dayjs(date).format(format ?? 'YYYY-MM-DD HH:mm:ss') : ''
73 }
74
75 /**
76  * 获取当前的日期+时间
77  */
78 export function getNowDateTime() {
79   return dayjs()
80 }
81
82 /**
83  * 获取当前日期是第几周
84  * @param dateTime 当前传入的日期值
85  * @returns 返回第几周数字值
86  */
87 export function getWeek(dateTime: Date): number {
88   const temptTime = new Date(dateTime.getTime())
89   // 周几
90   const weekday = temptTime.getDay() || 7
91   // 周1+5天=周六
92   temptTime.setDate(temptTime.getDate() - weekday + 1 + 5)
93   let firstDay = new Date(temptTime.getFullYear(), 0, 1)
94   const dayOfWeek = firstDay.getDay()
95   let spendDay = 1
96   if (dayOfWeek != 0) spendDay = 7 - dayOfWeek + 1
97   firstDay = new Date(temptTime.getFullYear(), 0, 1 + spendDay)
98   const d = Math.ceil((temptTime.valueOf() - firstDay.valueOf()) / 86400000)
99   return Math.ceil(d / 7)
100 }
101
102 /**
103  * 将时间转换为 `几秒前`、`几分钟前`、`几小时前`、`几天前`
104  * @param param 当前时间,new Date() 格式或者字符串时间格式
105  * @param format 需要转换的时间格式字符串
106  * @description param 10秒:  10 * 1000
107  * @description param 1分:   60 * 1000
108  * @description param 1小时: 60 * 60 * 1000
109  * @description param 24小时:60 * 60 * 24 * 1000
110  * @description param 3天:   60 * 60* 24 * 1000 * 3
111  * @returns 返回拼接后的时间字符串
112  */
113 export function formatPast(param: string | Date, format = 'YYYY-mm-dd HH:MM:SS'): string {
114   // 传入格式处理、存储转换值
115   let t: any, s: number
116   // 获取js 时间戳
117   let time: number = new Date().getTime()
118   // 是否是对象
119   typeof param === 'string' || 'object' ? (t = new Date(param).getTime()) : (t = param)
120   // 当前时间戳 - 传入时间戳
121   time = Number.parseInt(`${time - t}`)
122   if (time < 10000) {
123     // 10秒内
124     return '刚刚'
125   } else if (time < 60000 && time >= 10000) {
126     // 超过10秒少于1分钟内
127     s = Math.floor(time / 1000)
128     return `${s}秒前`
129   } else if (time < 3600000 && time >= 60000) {
130     // 超过1分钟少于1小时
131     s = Math.floor(time / 60000)
132     return `${s}分钟前`
133   } else if (time < 86400000 && time >= 3600000) {
134     // 超过1小时少于24小时
135     s = Math.floor(time / 3600000)
136     return `${s}小时前`
137   } else if (time < 259200000 && time >= 86400000) {
138     // 超过1天少于3天内
139     s = Math.floor(time / 86400000)
140     return `${s}天前`
141   } else {
142     // 超过3天
143     const date = typeof param === 'string' || 'object' ? new Date(param) : param
144     return formatDate(date, format)
145   }
146 }
147
148 /**
149  * 时间问候语
150  * @param param 当前时间,new Date() 格式
151  * @description param 调用 `formatAxis(new Date())` 输出 `上午好`
152  * @returns 返回拼接后的时间字符串
153  */
154 export function formatAxis(param: Date): string {
155   const hour: number = new Date(param).getHours()
156   if (hour < 6) return '凌晨好'
157   else if (hour < 9) return '早上好'
158   else if (hour < 12) return '上午好'
159   else if (hour < 14) return '中午好'
160   else if (hour < 17) return '下午好'
161   else if (hour < 19) return '傍晚好'
162   else if (hour < 22) return '晚上好'
163   else return '夜里好'
164 }
165
166 /**
167  * 将毫秒,转换成时间字符串。例如说,xx 分钟
168  *
169  * @param ms 毫秒
170  * @returns {string} 字符串
171  */
172 export function formatPast2(ms: number): string {
173   const day = Math.floor(ms / (24 * 60 * 60 * 1000))
174   const hour = Math.floor(ms / (60 * 60 * 1000) - day * 24)
175   const minute = Math.floor(ms / (60 * 1000) - day * 24 * 60 - hour * 60)
176   const second = Math.floor(ms / 1000 - day * 24 * 60 * 60 - hour * 60 * 60 - minute * 60)
177   if (day > 0) {
178     return day + ' 天' + hour + ' 小时 ' + minute + ' 分钟'
179   }
180   if (hour > 0) {
181     return hour + ' 小时 ' + minute + ' 分钟'
182   }
183   if (minute > 0) {
184     return minute + ' 分钟'
185   }
186   if (second > 0) {
187     return second + ' 秒'
188   } else {
189     return 0 + ' 秒'
190   }
191 }
192
193 /**
194  * element plus 的时间 Formatter 实现,使用 YYYY-MM-DD HH:mm:ss 格式
195  *
196  * @param row 行数据
197  * @param column 字段
198  * @param cellValue 字段值
199  */
200 export function dateFormatter(_row: any, _column: TableColumnCtx<any>, cellValue: any): string {
201   return cellValue ? formatDate(cellValue) : ''
202 }
203
204 /**
205  * element plus 的时间 Formatter 实现,使用 YYYY-MM-DD 格式
206  *
207  * @param row 行数据
208  * @param column 字段
209  * @param cellValue 字段值
210  */
211 export function dateFormatter2(_row: any, _column: TableColumnCtx<any>, cellValue: any): string {
212   return cellValue ? formatDate(cellValue, 'YYYY-MM-DD') : ''
213 }
214
215 /**
216  * 设置起始日期,时间为00:00:00
217  * @param param 传入日期
218  * @returns 带时间00:00:00的日期
219  */
220 export function beginOfDay(param: Date): Date {
221   return new Date(param.getFullYear(), param.getMonth(), param.getDate(), 0, 0, 0)
222 }
223
224 /**
225  * 设置结束日期,时间为23:59:59
226  * @param param 传入日期
227  * @returns 带时间23:59:59的日期
228  */
229 export function endOfDay(param: Date): Date {
230   return new Date(param.getFullYear(), param.getMonth(), param.getDate(), 23, 59, 59)
231 }
232
233 /**
234  * 计算两个日期间隔天数
235  * @param param1 日期1
236  * @param param2 日期2
237  */
238 export function betweenDay(param1: Date, param2: Date): number {
239   param1 = convertDate(param1)
240   param2 = convertDate(param2)
241   // 计算差值
242   return Math.floor((param2.getTime() - param1.getTime()) / (24 * 3600 * 1000))
243 }
244
245 /**
246  * 日期计算
247  * @param param1 日期
248  * @param param2 添加的时间
249  */
250 export function addTime(param1: Date, param2: number): Date {
251   param1 = convertDate(param1)
252   return new Date(param1.getTime() + param2)
253 }
254
255 /**
256  * 日期转换
257  * @param param 日期
258  */
259 export function convertDate(param: Date | string): Date {
260   if (typeof param === 'string') {
261     return new Date(param)
262   }
263   return param
264 }
265
266 /**
267  * 指定的两个日期, 是否为同一天
268  * @param a 日期 A
269  * @param b 日期 B
270  */
271 export function isSameDay(a: dayjs.ConfigType, b: dayjs.ConfigType): boolean {
272   if (!a || !b) return false
273
274   const aa = dayjs(a)
275   const bb = dayjs(b)
276   return aa.year() == bb.year() && aa.month() == bb.month() && aa.day() == bb.day()
277 }
278
279 /**
280  * 获取一天的开始时间、截止时间
281  * @param date 日期
282  * @param days 天数
283  */
284 export function getDayRange(
285   date: dayjs.ConfigType,
286   days: number
287 ): [dayjs.ConfigType, dayjs.ConfigType] {
288   const day = dayjs(date).add(days, 'd')
289   return getDateRange(day, day)
290 }
291
292 /**
293  * 获取最近7天的开始时间、截止时间
294  */
295 export function getLast7Days(): [dayjs.ConfigType, dayjs.ConfigType] {
296   const lastWeekDay = dayjs().subtract(7, 'd')
297   const yesterday = dayjs().subtract(1, 'd')
298   return getDateRange(lastWeekDay, yesterday)
299 }
300
301 /**
302  * 获取最近30天的开始时间、截止时间
303  */
304 export function getLast30Days(): [dayjs.ConfigType, dayjs.ConfigType] {
305   const lastMonthDay = dayjs().subtract(30, 'd')
306   const yesterday = dayjs().subtract(1, 'd')
307   return getDateRange(lastMonthDay, yesterday)
308 }
309
310 /**
311  * 获取最近1年的开始时间、截止时间
312  */
313 export function getLast1Year(): [dayjs.ConfigType, dayjs.ConfigType] {
314   const lastYearDay = dayjs().subtract(1, 'y')
315   const yesterday = dayjs().subtract(1, 'd')
316   return getDateRange(lastYearDay, yesterday)
317 }
318
319 /**
320  * 获取指定日期的开始时间、截止时间
321  * @param beginDate 开始日期
322  * @param endDate 截止日期
323  */
324 export function getDateRange(
325   beginDate: dayjs.ConfigType,
326   endDate: dayjs.ConfigType
327 ): [string, string] {
328   return [
329     dayjs(beginDate).startOf('d').format('YYYY-MM-DD HH:mm:ss'),
330     dayjs(endDate).endOf('d').format('YYYY-MM-DD HH:mm:ss')
331   ]
332 }