feat: format time utils
This commit is contained in:
@@ -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'),
|
||||||
|
];
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user