提交 | 用户 | 时间
|
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 |
} |