185 lines
5.5 KiB
TypeScript
185 lines
5.5 KiB
TypeScript
import dayjs from 'dayjs'
|
||
|
||
/**
|
||
* 获取下一个整点时间
|
||
* @returns 格式为 YYYY-MM-DD HH:mm 的字符串
|
||
*/
|
||
export const getNextHourTime = (): string => {
|
||
const now = dayjs()
|
||
const nextHour = now.add(1, 'hour').startOf('hour')
|
||
return nextHour.format('YYYY-MM-DD HH:mm')
|
||
}
|
||
|
||
/**
|
||
* 根据开始时间计算结束时间(2小时后)
|
||
* @param startTime 开始时间,格式为 YYYY-MM-DD HH:mm
|
||
* @returns 格式为 YYYY-MM-DD HH:mm 的字符串
|
||
*/
|
||
export const getEndTime = (startTime: string): string => {
|
||
const startDateTime = dayjs(startTime)
|
||
const endDateTime = startDateTime.add(2, 'hour')
|
||
return endDateTime.format('YYYY-MM-DD HH:mm')
|
||
}
|
||
|
||
export const getDateStr = (date: Date): string => {
|
||
return dayjs(date).format('YYYY-MM-DD HH:mm')
|
||
}
|
||
|
||
export const getDate = (date: string): string => {
|
||
return dayjs(date).format('YYYY年MM月DD日')
|
||
}
|
||
|
||
export const getDay = (date?: string | Date): string => {
|
||
if (!date) {
|
||
return dayjs().format('YYYY-MM-DD')
|
||
}
|
||
return dayjs(date).format('YYYY-MM-DD')
|
||
}
|
||
|
||
export const getMonth = (date?: string | Date): string => {
|
||
if (!date) {
|
||
return dayjs().format('MM月 YYYY')
|
||
}
|
||
return dayjs(date).format('MM月 YYYY')
|
||
}
|
||
|
||
export const getWeekend = (date?: string | Date): [Date, Date] => {
|
||
const today = dayjs(date);
|
||
const currentDayOfWeek = today.day();
|
||
console.log('currentDayOfWeek', currentDayOfWeek)
|
||
const saturdayOffset = 6 - currentDayOfWeek
|
||
const sundayOffset = 7 - currentDayOfWeek
|
||
const sat = today.add(saturdayOffset, 'day')
|
||
const sun = today.add(sundayOffset, 'day')
|
||
return [sat.toDate(), sun.toDate()]
|
||
}
|
||
|
||
export const getWeekendOfCurrentWeek = (days = 7): Date[] => {
|
||
const dayList: Date[] = [];
|
||
for (let i = 0; i < days; i++) {
|
||
const day = dayjs().add(i, 'day').toDate()
|
||
dayList.push(day)
|
||
}
|
||
return dayList
|
||
}
|
||
|
||
export const getTime = (time: string): string => {
|
||
const timeObj = dayjs(time)
|
||
const hour = timeObj.hour()
|
||
const minute = timeObj.minute()
|
||
|
||
// 判断是上午还是下午
|
||
const period = hour <= 12 ? 'AM' : 'PM'
|
||
|
||
// 转换为12小时制
|
||
const hour12 = hour === 0 ? 0 : hour > 12 ? hour - 12 : hour
|
||
|
||
// 格式化分钟,保证两位数
|
||
const minuteStr = minute.toString().padStart(2, '0')
|
||
|
||
return `${hour12}:${minuteStr} ${period}`
|
||
}
|
||
|
||
/**
|
||
* 格式化时间显示(相对时间)
|
||
* @param timeStr 时间字符串
|
||
* @returns 格式化后的时间字符串
|
||
*/
|
||
export const formatRelativeTime = (timeStr: string): string => {
|
||
if (!timeStr) return "";
|
||
|
||
const date = new Date(timeStr);
|
||
const now = new Date();
|
||
|
||
// 获取日期部分(年-月-日),忽略时间
|
||
const getDateString = (d: Date) => {
|
||
const year = d.getFullYear();
|
||
const month = d.getMonth() + 1;
|
||
const day = d.getDate();
|
||
return `${year}-${month.toString().padStart(2, '0')}-${day.toString().padStart(2, '0')}`;
|
||
};
|
||
|
||
const dateStr = getDateString(date);
|
||
const nowStr = getDateString(now);
|
||
|
||
// 计算日期差
|
||
const dateObj = new Date(dateStr);
|
||
const nowObj = new Date(nowStr);
|
||
const diffTime = nowObj.getTime() - dateObj.getTime();
|
||
const diffDays = Math.floor(diffTime / (1000 * 60 * 60 * 24));
|
||
|
||
if (diffDays === 0) {
|
||
// 今天
|
||
const hours = date.getHours();
|
||
const minutes = date.getMinutes();
|
||
return `今天 ${hours.toString().padStart(2, '0')}:${minutes.toString().padStart(2, '0')}`;
|
||
} else if (diffDays === 1) {
|
||
// 昨天
|
||
const hours = date.getHours();
|
||
const minutes = date.getMinutes();
|
||
return `昨天 ${hours.toString().padStart(2, '0')}:${minutes.toString().padStart(2, '0')}`;
|
||
} else if (diffDays < 7) {
|
||
// 一周内显示天数
|
||
return `${diffDays}天前`;
|
||
} else {
|
||
// 超过一周显示完整日期
|
||
const year = date.getFullYear();
|
||
const month = date.getMonth() + 1;
|
||
const day = date.getDate();
|
||
const hours = date.getHours();
|
||
const minutes = date.getMinutes();
|
||
return `${year}-${month.toString().padStart(2, '0')}-${day.toString().padStart(2, '0')} ${hours.toString().padStart(2, '0')}:${minutes.toString().padStart(2, '0')}`;
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 格式化时间显示(简短相对时间)
|
||
* @param timeStr 时间字符串
|
||
* @returns 格式化后的时间字符串
|
||
*/
|
||
export const formatShortRelativeTime = (timeStr: string): string => {
|
||
if (!timeStr) return "";
|
||
|
||
const date = new Date(timeStr);
|
||
const now = new Date();
|
||
|
||
// 获取日期部分(年-月-日),忽略时间
|
||
const getDateString = (d: Date) => {
|
||
const year = d.getFullYear();
|
||
const month = d.getMonth() + 1;
|
||
const day = d.getDate();
|
||
return `${year}-${month.toString().padStart(2, '0')}-${day.toString().padStart(2, '0')}`;
|
||
};
|
||
|
||
const dateStr = getDateString(date);
|
||
const nowStr = getDateString(now);
|
||
|
||
// 计算日期差
|
||
const dateObj = new Date(dateStr);
|
||
const nowObj = new Date(nowStr);
|
||
const diffTime = nowObj.getTime() - dateObj.getTime();
|
||
const diffDays = Math.floor(diffTime / (1000 * 60 * 60 * 24));
|
||
|
||
// 如果是今天,显示具体时间
|
||
if (diffDays === 0) {
|
||
const diff = now.getTime() - date.getTime();
|
||
const minutes = Math.floor(diff / (1000 * 60));
|
||
const hours = Math.floor(diff / (1000 * 60 * 60));
|
||
|
||
if (minutes < 1) {
|
||
return "刚刚";
|
||
} else if (minutes < 60) {
|
||
return `${minutes}分钟前`;
|
||
} else {
|
||
return `${hours}小时前`;
|
||
}
|
||
} else if (diffDays === 1) {
|
||
return "1天前";
|
||
} else if (diffDays < 7) {
|
||
return `${diffDays}天前`;
|
||
} else {
|
||
const month = date.getMonth() + 1;
|
||
const day = date.getDate();
|
||
return `${month}月${day}日`;
|
||
}
|
||
} |