/* * @Description: * @FilePath: \erp-basic-web\packages\shared\src\utils\date.ts * @Author: freud * @Date: 2023-06-06 14:37:45 * @LastEditTime: 2023-07-04 10:35:11 * @LastEditors: freud * @Reference: */ import dateFn, { type ConfigType } from 'dayjs'; import utc from 'dayjs/plugin/utc'; dateFn.extend(utc); let timeZone: FormatParams['timezone'] = { offsetHours: 0, offsetMinutes: 0 }; let isInChina = false; const getTimeZone = (timezone?: FormatParams['timezone']): Required => { return timezone ?? timeZone; }; const setTimeZone = (timezone: FormatParams['timezone']) => { timeZone = timezone; }; const DATE_TIME_TEMPLATE = 'YYYY-MM-DD HH:mm:ss'; const DATE_TEMPLATE = 'YYYY-MM-DD'; const DATE_ZERO_TEMPLATE = 'YYYY-MM-DD 00:00:00'; const getDateFormatTemplate = () => { return { DATE_TIME_TEMPLATE: isInChina ? 'YYYY-MM-DD HH:mm:ss' : 'MM/DD/YYYY HH:mm:ss', DATE_TEMPLATE: isInChina ? 'YYYY-MM-DD' : 'MM/DD/YYYY', }; }; const setUserCountry = (isChina: boolean) => { isInChina = isChina; }; interface TimeZone { offsetHours: number; offsetMinutes: number; } interface FormatParams { date?: ConfigType; isSubmit?: boolean; timezone?: TimeZone; format?: typeof DATE_TEMPLATE | typeof DATE_TIME_TEMPLATE | string; } /** * @description 格式化日期时间 * @param date 待格式化的日期时间 * @returns 格式化后的日期字符串 */ function formatDateTime(date?: ConfigType, isSubmit = false): string { const { DATE_TIME_TEMPLATE: _DATE_TIME_TEMPLATE } = getDateFormatTemplate(); return formatDate(date, isSubmit ? DATE_TIME_TEMPLATE : _DATE_TIME_TEMPLATE, isSubmit); } /** * @description 格式化日期时间 * @param date 待格式化的日期时间 * @param format 格式化的方式 * @returns 格式化后的日期字符串,默认:YYYY-MM-DD */ function formatDate(date?: ConfigType, format?: string, isSubmit = false): string { if (!date) return ''; const { DATE_TEMPLATE: _DATE_TEMPLATE } = getDateFormatTemplate(); format = format || (isSubmit ? DATE_TEMPLATE : _DATE_TEMPLATE); if (isSubmit) { return dateFn(date).utc().format(format); } return dateFn(date).format(format); } /** * @description 格式化UTC日期时间 * @param date 待格式化的UTC日期时间 * @returns 格式化后的日期字符串 */ function formatUtcDateTime({ date, isSubmit = false, timezone }: FormatParams): string { const { DATE_TIME_TEMPLATE: _DATE_TIME_TEMPLATE } = getDateFormatTemplate(); return formatUtcDate({ date, format: isSubmit ? DATE_TIME_TEMPLATE : _DATE_TIME_TEMPLATE, isSubmit, timezone, }); } /** * @description 格式化UTC日期时间 * @param date 待格式化的UTC日期时间 * @param format 格式化的方式 * @returns 格式化后的日期字符串,默认:YYYY-MM-DD */ function formatUtcDate({ date, format, isSubmit = false, timezone }: FormatParams): string { if (!date) return ''; const { DATE_TEMPLATE: _DATE_TEMPLATE } = getDateFormatTemplate(); format = format || (isSubmit ? DATE_TEMPLATE : _DATE_TEMPLATE); // eslint-disable-next-line @typescript-eslint/no-non-null-assertion const { offsetHours, offsetMinutes } = getTimeZone(timezone)!; if (isSubmit) { return dateFn(date) .subtract(offsetHours * 60 + offsetMinutes, 'minute') .format(format); } return dateFn(date) .add(offsetHours * 60 + offsetMinutes, 'minute') .format(format); } const dateTransferFn = ({ date, to = 'local', timezone, }: { date: ConfigType; to?: 'utc' | 'local'; timezone?: FormatParams['timezone']; }) => { // eslint-disable-next-line @typescript-eslint/no-non-null-assertion const { offsetHours, offsetMinutes } = getTimeZone(timezone)!; if (to === 'utc') { return dateFn(date).subtract(offsetHours * 60 + offsetMinutes, 'minute'); } return dateFn(date).add(offsetHours * 60 + offsetMinutes, 'minute'); }; export { DATE_ZERO_TEMPLATE, dateFn, dateTransferFn, formatDate, formatDateTime, formatUtcDate, formatUtcDateTime, setTimeZone, setUserCountry, }; export type { ConfigType, FormatParams, TimeZone };