feat: format time utils

This commit is contained in:
xingyu4j
2025-06-21 19:30:43 +08:00
parent 2690ea82a6
commit f15be6eade

View File

@@ -1,47 +1,67 @@
import dayjs from 'dayjs'; import dayjs from 'dayjs';
import { isEmpty } from '.'; import { formatDate } from './date';
/** 时间段选择器拓展 */ /**
export function rangePickerExtend() { * @param {Date | number | string} time 需要转换的时间
return { * @param {string} fmt 需要转换的格式 如 yyyy-MM-dd、yyyy-MM-dd HH:mm:ss
// 显示格式 */
format: 'YYYY-MM-DD HH:mm:ss', export function formatTime(time: Date | number | string, fmt: string) {
placeholder: ['开始时间', '结束时间'], if (time) {
ranges: { const date = new Date(time);
: [dayjs().startOf('day'), dayjs().endOf('day')], const o = {
7: [ 'M+': date.getMonth() + 1,
dayjs().subtract(7, 'day').startOf('day'), 'd+': date.getDate(),
dayjs().endOf('day'), 'H+': date.getHours(),
], 'm+': date.getMinutes(),
30: [ 's+': date.getSeconds(),
dayjs().subtract(30, 'day').startOf('day'), 'q+': Math.floor((date.getMonth() + 3) / 3),
dayjs().endOf('day'), S: date.getMilliseconds(),
], };
: [ const yearMatch = fmt.match(/y+/);
dayjs().subtract(1, 'day').startOf('day'), if (yearMatch) {
dayjs().subtract(1, 'day').endOf('day'), fmt = fmt.replace(
], yearMatch[0],
: [dayjs().startOf('week'), dayjs().endOf('day')], `${date.getFullYear()}`.slice(4 - yearMatch[0].length),
: [dayjs().startOf('month'), dayjs().endOf('day')], );
}, }
showTime: { for (const k in o) {
defaultValue: [ const match = fmt.match(new RegExp(`(${k})`));
dayjs('00:00:00', 'HH:mm:ss'), if (match) {
dayjs('23:59:59', 'HH:mm:ss'), fmt = fmt.replace(
], match[0],
format: 'HH:mm:ss', match[0].length === 1
}, ? (o[k as keyof typeof o] as any)
transformDateFunc: (dates: any) => { : `00${o[k as keyof typeof o]}`.slice(
if (dates && dates.length === 2) { `${o[k as keyof typeof o]}`.length,
// 格式化为后台支持的时间格式 ),
return [dates.createTime[0], dates.createTime[1]].join(','); );
} }
return {}; }
}, return fmt;
// 如果需要10位时间戳秒级可以使用 valueFormat: 'X' } else {
valueFormat: 'YYYY-MM-DD HH:mm:ss', return '';
}; }
}
/**
* 获取当前日期是第几周
* @param dateTime 当前传入的日期值
* @returns 返回第几周数字值
*/
export function getWeek(dateTime: Date): number {
const temptTime = new Date(dateTime);
// 周几
const weekday = temptTime.getDay() || 7;
// 周1+5天=周六
temptTime.setDate(temptTime.getDate() - weekday + 1 + 5);
let firstDay = new Date(temptTime.getFullYear(), 0, 1);
const dayOfWeek = firstDay.getDay();
let spendDay = 1;
if (dayOfWeek !== 0) spendDay = 7 - dayOfWeek + 1;
firstDay = new Date(temptTime.getFullYear(), 0, 1 + spendDay);
const d = Math.ceil((temptTime.valueOf() - firstDay.valueOf()) / 86_400_000);
return Math.ceil(d / 7);
} }
/** /**
@@ -94,10 +114,28 @@ export function formatPast(
typeof param === 'string' || typeof param === 'object' typeof param === 'string' || typeof param === 'object'
? new Date(param) ? new Date(param)
: param; : param;
return dayjs(date).format(format); return formatDate(date, format) as string;
} }
} }
/**
* 时间问候语
* @param param 当前时间new Date() 格式
* @description param 调用 `formatAxis(new Date())` 输出 `上午好`
* @returns 返回拼接后的时间字符串
*/
export function formatAxis(param: Date): string {
const hour: number = new Date(param).getHours();
if (hour < 6) return '凌晨好';
else if (hour < 9) return '早上好';
else if (hour < 12) return '上午好';
else if (hour < 14) return '中午好';
else if (hour < 17) return '下午好';
else if (hour < 19) return '傍晚好';
else if (hour < 22) return '晚上好';
else return '夜里好';
}
/** /**
* 将毫秒转换成时间字符串。例如说xx 分钟 * 将毫秒转换成时间字符串。例如说xx 分钟
* *
@@ -105,22 +143,12 @@ export function formatPast(
* @returns {string} 字符串 * @returns {string} 字符串
*/ */
export function formatPast2(ms: number): string { export function formatPast2(ms: number): string {
if (isEmpty(ms)) { const day = Math.floor(ms / (24 * 60 * 60 * 1000));
return ''; const hour = Math.floor(ms / (60 * 60 * 1000) - day * 24);
} const minute = Math.floor(ms / (60 * 1000) - day * 24 * 60 - hour * 60);
// 定义时间单位常量,便于维护 const second = Math.floor(
const SECOND = 1000; ms / 1000 - day * 24 * 60 * 60 - hour * 60 * 60 - minute * 60,
const MINUTE = 60 * SECOND; );
const HOUR = 60 * MINUTE;
const DAY = 24 * HOUR;
// 计算各时间单位
const day = Math.floor(ms / DAY);
const hour = Math.floor((ms % DAY) / HOUR);
const minute = Math.floor((ms % HOUR) / MINUTE);
const second = Math.floor((ms % MINUTE) / SECOND);
// 根据时间长短返回不同格式
if (day > 0) { if (day > 0) {
return `${day}${hour} 小时 ${minute} 分钟`; return `${day}${hour} 小时 ${minute} 分钟`;
} }
@@ -134,43 +162,138 @@ export function formatPast2(ms: number): string {
} }
/** /**
* @param {Date | number | string} time 需要转换的时间 * 设置起始日期时间为00:00:00
* @param {string} fmt 需要转换的格式 如 yyyy-MM-dd、yyyy-MM-dd HH:mm:ss * @param param 传入日期
* @returns 带时间00:00:00的日期
*/ */
export function formatTime(time: Date | number | string, fmt: string) { export function beginOfDay(param: Date): Date {
if (time) { return new Date(
const date = new Date(time); param.getFullYear(),
const o = { param.getMonth(),
'M+': date.getMonth() + 1, param.getDate(),
'd+': date.getDate(), 0,
'H+': date.getHours(), 0,
'm+': date.getMinutes(), 0,
's+': date.getSeconds(), );
'q+': Math.floor((date.getMonth() + 3) / 3), }
S: date.getMilliseconds(),
}; /**
const yearMatch = fmt.match(/y+/); * 设置结束日期时间为23:59:59
if (yearMatch) { * @param param 传入日期
fmt = fmt.replace( * @returns 带时间23:59:59的日期
yearMatch[0], */
`${date.getFullYear()}`.slice(4 - yearMatch[0].length), export function endOfDay(param: Date): Date {
); return new Date(
} param.getFullYear(),
for (const k in o) { param.getMonth(),
const match = fmt.match(new RegExp(`(${k})`)); param.getDate(),
if (match) { 23,
fmt = fmt.replace( 59,
match[0], 59,
match[0].length === 1 );
? (o[k as keyof typeof o] as any) }
: `00${o[k as keyof typeof o]}`.slice(
`${o[k as keyof typeof o]}`.length, /**
), * 计算两个日期间隔天数
); * @param param1 日期1
} * @param param2 日期2
} */
return fmt; export function betweenDay(param1: Date, param2: Date): number {
} else { param1 = convertDate(param1);
return ''; param2 = convertDate(param2);
} // 计算差值
return Math.floor((param2.getTime() - param1.getTime()) / (24 * 3600 * 1000));
}
/**
* 日期计算
* @param param1 日期
* @param param2 添加的时间
*/
export function addTime(param1: Date, param2: number): Date {
param1 = convertDate(param1);
return new Date(param1.getTime() + param2);
}
/**
* 日期转换
* @param param 日期
*/
export function convertDate(param: Date | string): Date {
if (typeof param === 'string') {
return new Date(param);
}
return param;
}
/**
* 指定的两个日期, 是否为同一天
* @param a 日期 A
* @param b 日期 B
*/
export function isSameDay(a: dayjs.ConfigType, b: dayjs.ConfigType): boolean {
if (!a || !b) return false;
const aa = dayjs(a);
const bb = dayjs(b);
return (
aa.year() === bb.year() &&
aa.month() === bb.month() &&
aa.day() === bb.day()
);
}
/**
* 获取一天的开始时间、截止时间
* @param date 日期
* @param days 天数
*/
export function getDayRange(
date: dayjs.ConfigType,
days: number,
): [dayjs.ConfigType, dayjs.ConfigType] {
const day = dayjs(date).add(days, 'd');
return getDateRange(day, day);
}
/**
* 获取最近7天的开始时间、截止时间
*/
export function getLast7Days(): [dayjs.ConfigType, dayjs.ConfigType] {
const lastWeekDay = dayjs().subtract(7, 'd');
const yesterday = dayjs().subtract(1, 'd');
return getDateRange(lastWeekDay, yesterday);
}
/**
* 获取最近30天的开始时间、截止时间
*/
export function getLast30Days(): [dayjs.ConfigType, dayjs.ConfigType] {
const lastMonthDay = dayjs().subtract(30, 'd');
const yesterday = dayjs().subtract(1, 'd');
return getDateRange(lastMonthDay, yesterday);
}
/**
* 获取最近1年的开始时间、截止时间
*/
export function getLast1Year(): [dayjs.ConfigType, dayjs.ConfigType] {
const lastYearDay = dayjs().subtract(1, 'y');
const yesterday = dayjs().subtract(1, 'd');
return getDateRange(lastYearDay, yesterday);
}
/**
* 获取指定日期的开始时间、截止时间
* @param beginDate 开始日期
* @param endDate 截止日期
*/
export function getDateRange(
beginDate: dayjs.ConfigType,
endDate: dayjs.ConfigType,
): [string, string] {
return [
dayjs(beginDate).startOf('d').format('YYYY-MM-DD HH:mm:ss'),
dayjs(endDate).endOf('d').format('YYYY-MM-DD HH:mm:ss'),
];
} }