You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

219 lines
5.0 KiB

/**
* Day.js
*
*/
import dayjs from 'dayjs';
import relativeTime from 'dayjs/plugin/relativeTime';
import calendar from 'dayjs/plugin/calendar';
import duration from 'dayjs/plugin/duration';
import isSameOrBefore from 'dayjs/plugin/isSameOrBefore';
import isSameOrAfter from 'dayjs/plugin/isSameOrAfter';
import 'dayjs/locale/zh-cn';
// 扩展插件
dayjs.extend(relativeTime);
dayjs.extend(calendar);
dayjs.extend(duration);
dayjs.extend(isSameOrBefore);
dayjs.extend(isSameOrAfter);
// 设置默认语言为中文
dayjs.locale('zh-cn');
/**
*
*/
export const DATE_FORMATS = {
FULL: 'YYYY-MM-DD HH:mm:ss',
DATE: 'YYYY-MM-DD',
TIME: 'HH:mm:ss',
DATE_TIME: 'YYYY-MM-DD HH:mm',
MONTH_DAY: 'MM-DD',
HOUR_MINUTE: 'HH:mm',
YEAR_MONTH: 'YYYY-MM',
CHINESE_DATE: 'YYYY年MM月DD日',
CHINESE_FULL: 'YYYY年MM月DD日 HH:mm:ss',
} as const;
/**
*
* @param date Date
* @param format YYYY-MM-DD HH:mm:ss
*/
export const formatDate = (
date: Date | string | number,
format: string = DATE_FORMATS.FULL
): string => {
return dayjs(date).format(format);
};
/**
* 32
*/
export const formatRelativeTime = (date: Date | string | number): string => {
return dayjs(date).fromNow();
};
/**
*
*/
export const formatCalendarTime = (date: Date | string | number): string => {
return dayjs(date).calendar(null, {
sameDay: '[今天] HH:mm',
lastDay: '[昨天] HH:mm',
lastWeek: 'MM-DD HH:mm',
sameElse: 'YYYY-MM-DD HH:mm',
});
};
/**
*
*
* "昨天 + 时间"
* "月-日 时间"
* "年-月-日"
*/
export const formatChatTime = (timestamp: number | string | Date): string => {
const date = dayjs(timestamp);
const now = dayjs();
if (date.isSame(now, 'day')) {
// 今天
return date.format('HH:mm');
} else if (date.isSame(now.subtract(1, 'day'), 'day')) {
// 昨天
return '昨天 ' + date.format('HH:mm');
} else if (date.isSame(now, 'year')) {
// 本年
return date.format('MM-DD HH:mm');
} else {
// 往年
return date.format('YYYY-MM-DD');
}
};
/**
*
*/
export const getTimeDiff = (
startDate: Date | string | number,
endDate: Date | string | number = new Date()
) => {
const start = dayjs(startDate);
const end = dayjs(endDate);
const diff = end.diff(start);
const duration = dayjs.duration(diff);
return {
years: duration.years(),
months: duration.months(),
days: duration.days(),
hours: duration.hours(),
minutes: duration.minutes(),
seconds: duration.seconds(),
milliseconds: duration.milliseconds(),
totalDays: Math.floor(duration.asDays()),
totalHours: Math.floor(duration.asHours()),
totalMinutes: Math.floor(duration.asMinutes()),
totalSeconds: Math.floor(duration.asSeconds()),
};
};
/**
*
*/
export const isToday = (date: Date | string | number): boolean => {
return dayjs(date).isSame(dayjs(), 'day');
};
/**
*
*/
export const isYesterday = (date: Date | string | number): boolean => {
return dayjs(date).isSame(dayjs().subtract(1, 'day'), 'day');
};
/**
*
*/
export const isThisWeek = (date: Date | string | number): boolean => {
return dayjs(date).isSame(dayjs(), 'week');
};
/**
*
*/
export const isThisMonth = (date: Date | string | number): boolean => {
return dayjs(date).isSame(dayjs(), 'month');
};
/**
*
*/
export const isThisYear = (date: Date | string | number): boolean => {
return dayjs(date).isSame(dayjs(), 'year');
};
/**
*
*/
export const getDateRange = (type: 'day' | 'week' | 'month' | 'year') => {
const now = dayjs();
return {
start: now.startOf(type).toDate(),
end: now.endOf(type).toDate(),
};
};
/**
*
*/
export const addTime = (
date: Date | string | number,
amount: number,
unit: dayjs.ManipulateType
): Date => {
return dayjs(date).add(amount, unit).toDate();
};
/**
*
*/
export const subtractTime = (
date: Date | string | number,
amount: number,
unit: dayjs.ManipulateType
): Date => {
return dayjs(date).subtract(amount, unit).toDate();
};
/**
*
*/
export const isBetween = (
date: Date | string | number,
startDate: Date | string | number,
endDate: Date | string | number
): boolean => {
const target = dayjs(date);
return target.isAfter(startDate) && target.isBefore(endDate);
};
/**
*
*/
export const now = (): number => {
return dayjs().valueOf();
};
/**
*
*/
export const nowInSeconds = (): number => {
return Math.floor(dayjs().valueOf() / 1000);
};
export default dayjs;