86 lines
2.0 KiB
TypeScript
86 lines
2.0 KiB
TypeScript
import dayjs from 'dayjs'
|
||
|
||
type FormatDate = Date | dayjs.Dayjs | number | string
|
||
|
||
type Format
|
||
= | 'HH'
|
||
| 'HH:mm'
|
||
| 'HH:mm:ss'
|
||
| 'YYYY'
|
||
| 'YYYY-MM'
|
||
| 'YYYY-MM-DD'
|
||
| 'YYYY-MM-DD HH'
|
||
| 'YYYY-MM-DD HH:mm'
|
||
| 'YYYY-MM-DD HH:mm:ss'
|
||
| (string & {})
|
||
|
||
/** 格式化日期 */
|
||
export function formatDate(time?: FormatDate, format: Format = 'YYYY-MM-DD') {
|
||
if (!time) {
|
||
return ''
|
||
}
|
||
try {
|
||
const date = dayjs.isDayjs(time) ? time : dayjs(time)
|
||
if (!date.isValid()) {
|
||
throw new Error('Invalid date')
|
||
}
|
||
return date.format(format)
|
||
} catch (error) {
|
||
console.error(`Error formatting date: ${error}`)
|
||
return String(time ?? '')
|
||
}
|
||
}
|
||
|
||
/** 格式化日期时间 */
|
||
export function formatDateTime(time?: FormatDate) {
|
||
return formatDate(time, 'YYYY-MM-DD HH:mm:ss')
|
||
}
|
||
|
||
/** 计算开始结束时间 */
|
||
export function formatDateRange(dateRange?: [any, any]) {
|
||
if (!dateRange || !dateRange[0] || !dateRange[1]) {
|
||
return undefined
|
||
}
|
||
const startDate = new Date(dateRange[0])
|
||
startDate.setHours(0, 0, 0, 0)
|
||
const endDate = new Date(dateRange[1])
|
||
endDate.setHours(23, 59, 59, 999)
|
||
return [formatDateTime(startDate), formatDateTime(endDate)]
|
||
}
|
||
|
||
/** 格式化过去时间(如:3分钟前、2小时前、1天前) */
|
||
export function formatPast(time?: FormatDate): string {
|
||
if (!time) {
|
||
return ''
|
||
}
|
||
const now = Date.now()
|
||
const date = dayjs.isDayjs(time) ? time : dayjs(time)
|
||
if (!date.isValid()) {
|
||
return ''
|
||
}
|
||
const diff = now - date.valueOf()
|
||
const seconds = Math.floor(diff / 1000)
|
||
const minutes = Math.floor(seconds / 60)
|
||
const hours = Math.floor(minutes / 60)
|
||
const days = Math.floor(hours / 24)
|
||
const months = Math.floor(days / 30)
|
||
const years = Math.floor(days / 365)
|
||
|
||
if (years > 0) {
|
||
return `${years}年前`
|
||
}
|
||
if (months > 0) {
|
||
return `${months}个月前`
|
||
}
|
||
if (days > 0) {
|
||
return `${days}天前`
|
||
}
|
||
if (hours > 0) {
|
||
return `${hours}小时前`
|
||
}
|
||
if (minutes > 0) {
|
||
return `${minutes}分钟前`
|
||
}
|
||
return '刚刚'
|
||
}
|