151 lines
3.9 KiB
TypeScript
151 lines
3.9 KiB
TypeScript
import dayjs from 'dayjs'
|
|
import calendar from 'dayjs/plugin/calendar'
|
|
import quarterOfYear from 'dayjs/plugin/quarterOfYear'
|
|
import relativeTime from 'dayjs/plugin/relativeTime'
|
|
import updateLocale from 'dayjs/plugin/updateLocale'
|
|
import utc from 'dayjs/plugin/utc'
|
|
import weekday from 'dayjs/plugin/weekday'
|
|
import 'dayjs/locale/zh-cn'
|
|
|
|
dayjs.extend(calendar)
|
|
dayjs.extend(quarterOfYear)
|
|
dayjs.extend(relativeTime)
|
|
dayjs.extend(updateLocale)
|
|
dayjs.extend(utc)
|
|
dayjs.extend(weekday)
|
|
|
|
dayjs.locale('zh-cn')
|
|
|
|
dayjs.updateLocale('zh-cn', {
|
|
calendar: {
|
|
sameDay: 'HH:mm',
|
|
nextDay: '[明天]',
|
|
nextWeek: 'dddd',
|
|
lastDay: '[昨天] HH:mm',
|
|
lastWeek: 'dddd HH:mm',
|
|
sameElse: 'YYYY年M月D日 HH:mm',
|
|
},
|
|
relativeTime: {
|
|
future: '%s后',
|
|
past: '%s前',
|
|
s: '几秒',
|
|
m: '1分钟',
|
|
mm: '%d分钟',
|
|
h: '1小时',
|
|
hh: '%d小时',
|
|
d: '1天',
|
|
dd: '%d天',
|
|
M: '1个月',
|
|
MM: '%d个月',
|
|
y: '1年',
|
|
yy: '%d年',
|
|
},
|
|
})
|
|
|
|
/** 时间工具 */
|
|
export const dateUtil = dayjs
|
|
|
|
export const DATETIME_FORMAT = 'YYYY-MM-DD HH:mm:ss'
|
|
export const DATE_FORMAT = 'YYYY-MM-DD'
|
|
export const TIME_FORMAT = 'HH:mm'
|
|
|
|
/**
|
|
* 格式化日期
|
|
* @param _date 日期对象、时间戳或字符串
|
|
* @param format 格式字符串
|
|
* @returns 格式化后的日期字符串
|
|
*/
|
|
function _format(_date: dayjs.ConfigType, format: string): string {
|
|
if (!_date) {
|
|
return _date as any
|
|
}
|
|
const date = dateUtil(_date)
|
|
return date.isValid() ? date.format(format) : (_date as string)
|
|
}
|
|
/**
|
|
* 格式化为日期时间字符串
|
|
* @param date 日期对象、时间戳或字符串
|
|
* @param format 格式字符串,默认为 DATETIME_FORMAT
|
|
* @returns 格式化后的日期时间字符串
|
|
*/
|
|
export function formatToDatetime(date: dayjs.ConfigType = undefined, format: string = DATETIME_FORMAT): string {
|
|
return _format(date, format)
|
|
}
|
|
|
|
/**
|
|
* 格式化为日期字符串
|
|
* @param date 日期对象、时间戳或字符串
|
|
* @param format 格式字符串,默认为 DATE_FORMAT
|
|
* @returns 格式化后的日期字符串
|
|
*/
|
|
export function formatToDate(date: dayjs.ConfigType = undefined, format: string = DATE_FORMAT): string {
|
|
return _format(date, format)
|
|
}
|
|
|
|
/**
|
|
* 格式化为日期字符串
|
|
* @param date 日期对象、时间戳或字符串
|
|
* @param format 格式字符串,默认为 TIME_FORMAT
|
|
* @returns 格式化后的日期字符串
|
|
*/
|
|
export function formatToTime(date: dayjs.ConfigType = undefined, format: string = TIME_FORMAT): string {
|
|
return _format(date, format)
|
|
}
|
|
|
|
/**
|
|
* 时间人性化显示
|
|
* @param date 要格式化的日期
|
|
* @param oppositeDate 参考日期,默认为当前时间
|
|
* @returns 人性化的时间字符串
|
|
*/
|
|
export function humanizedDate(date: dayjs.ConfigType, oppositeDate: dayjs.ConfigType = undefined): string {
|
|
if (!date || !dateUtil(date).isValid()) {
|
|
return ''
|
|
}
|
|
|
|
const now = oppositeDate ? dateUtil(oppositeDate) : dateUtil()
|
|
const diffSeconds = now.diff(date, 'second')
|
|
const diffMinutes = now.diff(date, 'minute')
|
|
const diffHours = now.diff(date, 'hour')
|
|
const diffDays = now.diff(date, 'day')
|
|
|
|
if (diffSeconds < 60) {
|
|
return `${diffSeconds}秒前`
|
|
}
|
|
else if (diffMinutes < 60) {
|
|
return `${diffMinutes}分钟前`
|
|
}
|
|
else if (diffHours < 24) {
|
|
return `${diffHours}小时前`
|
|
}
|
|
else if (diffDays < 7) {
|
|
return `${diffDays}天前`
|
|
}
|
|
else {
|
|
return formatToDatetime(date)
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 获取时辰问候语
|
|
* @returns 根据当前时间返回相应的问候语
|
|
*/
|
|
export function getGreeting(): string {
|
|
const currentHour = dateUtil().hour()
|
|
if (currentHour >= 5 && currentHour < 12) {
|
|
return '早上好'
|
|
}
|
|
else if (currentHour >= 12 && currentHour < 14) {
|
|
return '中午好'
|
|
}
|
|
else if (currentHour >= 14 && currentHour < 18) {
|
|
return '下午好'
|
|
}
|
|
else if (currentHour >= 18 && currentHour < 24) {
|
|
return '晚上好'
|
|
}
|
|
else {
|
|
return '深夜了'
|
|
}
|
|
}
|