import dayjs from 'dayjs';
|
import timezone from 'dayjs/plugin/timezone.js';
|
import utc from 'dayjs/plugin/utc.js';
|
|
dayjs.extend(utc);
|
dayjs.extend(timezone);
|
|
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 === undefined || time === null || time === '') {
|
return '';
|
}
|
try {
|
const date = dayjs.isDayjs(time) ? time : dayjs(time);
|
if (!date.isValid()) {
|
throw new Error('Invalid date');
|
}
|
return date.tz().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 formatDate2(date: Date, format?: string): string {
|
// 日期不存在,则返回空
|
if (!date) {
|
return '';
|
}
|
// 日期存在,则进行格式化
|
return date ? dayjs(date).format(format ?? 'YYYY-MM-DD HH:mm:ss') : '';
|
}
|
|
export function isDate(value: any): value is Date {
|
return value instanceof Date;
|
}
|
|
export function isDayjsObject(value: any): value is dayjs.Dayjs {
|
return dayjs.isDayjs(value);
|
}
|
|
/**
|
* element plus 的时间 Formatter 实现,使用 YYYY-MM-DD HH:mm:ss 格式
|
*
|
* @param _row
|
* @param _column
|
* @param cellValue 字段值
|
*/
|
export function dateFormatter(_row: any, _column: any, cellValue: any): string {
|
return cellValue ? formatDate(cellValue)?.toString() || '' : '';
|
}
|
|
/**
|
* 获取当前时区
|
* @returns 当前时区
|
*/
|
export const getSystemTimezone = () => {
|
return dayjs.tz.guess();
|
};
|
|
/**
|
* 自定义设置的时区
|
*/
|
let currentTimezone = getSystemTimezone();
|
|
/**
|
* 设置默认时区
|
* @param timezone
|
*/
|
export const setCurrentTimezone = (timezone?: string) => {
|
currentTimezone = timezone || getSystemTimezone();
|
dayjs.tz.setDefault(currentTimezone);
|
};
|
|
/**
|
* 获取设置的时区
|
* @returns 设置的时区
|
*/
|
export const getCurrentTimezone = () => {
|
return currentTimezone;
|
};
|
|
/**
|
* 把 antd TimePicker / DatePicker `@update:value` 回传的值统一成字符串。
|
*
|
* antd 在设置了 `value-format` 后实际只会回传字符串,
|
* 但 `@update:value` 的类型仍包含 `Dayjs`,调用方需要做一次类型归一。
|
*
|
* - 空值(null / undefined / '' / 0)返回 ''
|
* - 已经是字符串:原样返回(保持 `value-format` 已格式化的结果)
|
* - 兜底的 Dayjs:调用 `.format()` 转默认 ISO 字符串
|
*/
|
export function formatDayjs(
|
value: dayjs.Dayjs | null | string | undefined,
|
): string {
|
if (!value) {
|
return '';
|
}
|
return typeof value === 'string' ? value : value.format();
|
}
|