Files
2025-09-09 22:07:36 +08:00

325 lines
7.8 KiB
TypeScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* 轻量级日期工具类
* 基于 uni-app-x UTS Date API
* 参考 dayjs 设计理念
*/
export class DayUts {
private _date: Date;
constructor(date?: Date | string | number | null) {
if (date == null || date == "") {
this._date = new Date();
} else if (typeof date == "string") {
this._date = new Date(date);
} else if (typeof date == "number") {
this._date = new Date(date);
} else if (date instanceof Date) {
this._date = new Date(date.getTime());
} else {
this._date = new Date();
}
}
/**
* 格式化日期
* @param template 格式模板,支持 YYYY-MM-DD HH:mm:ss 等
*/
format(template: string): string {
// 使用传入的模板
let actualTemplate: string = template;
const year = this._date.getFullYear();
const month = this._date.getMonth() + 1;
const date = this._date.getDate();
const hours = this._date.getHours();
const minutes = this._date.getMinutes();
const seconds = this._date.getSeconds();
const milliseconds = this._date.getMilliseconds();
// 使用数组来依次替换避免UTS的replace方法兼容性问题
let result: string = actualTemplate;
// 按照长度从长到短替换,避免冲突
// 替换年份 (YYYY 必须在 YY 之前)
result = result.replace("YYYY", year.toString());
result = result.replace("YY", year.toString().slice(-2));
// 替换月份 (MM 必须在 M 之前)
result = result.replace("MM", month.toString().padStart(2, "0"));
result = result.replace("M", month.toString());
// 替换日期 (DD 必须在 D 之前)
result = result.replace("DD", date.toString().padStart(2, "0"));
result = result.replace("D", date.toString());
// 替换小时 (HH 必须在 H 之前)
result = result.replace("HH", hours.toString().padStart(2, "0"));
result = result.replace("H", hours.toString());
// 替换分钟 (mm 必须在 m 之前)
result = result.replace("mm", minutes.toString().padStart(2, "0"));
result = result.replace("m", minutes.toString());
// 替换秒数 (ss 必须在 s 之前)
result = result.replace("ss", seconds.toString().padStart(2, "0"));
result = result.replace("s", seconds.toString());
// 替换毫秒
result = result.replace("SSS", milliseconds.toString().padStart(3, "0"));
return result;
}
/**
* 本月多少天
*/
getDays(): number {
return new Date(this._date.getFullYear(), this._date.getMonth() + 1, 0).getDate();
}
/**
* 是否为闰年
*/
isLeapYear(): boolean {
return this._date.getFullYear() % 4 == 0 && this._date.getFullYear() % 100 != 0;
}
/**
* 星期几
*/
getDay(): number {
return this._date.getDay();
}
/**
* 获取某个单位的开始时间
*/
startOf(unit: "month" | "day" | "year" | "week"): DayUts {
const newDate = new Date(this._date.getTime());
switch (unit) {
case "year":
newDate.setMonth(0);
newDate.setDate(1);
newDate.setHours(0);
newDate.setMinutes(0);
newDate.setSeconds(0);
newDate.setMilliseconds(0);
break;
case "month":
newDate.setDate(1);
newDate.setHours(0);
newDate.setMinutes(0);
newDate.setSeconds(0);
newDate.setMilliseconds(0);
break;
case "week":
newDate.setDate(newDate.getDate() - newDate.getDay());
newDate.setHours(0);
newDate.setMinutes(0);
newDate.setSeconds(0);
newDate.setMilliseconds(0);
break;
case "day":
newDate.setHours(0);
newDate.setMinutes(0);
newDate.setSeconds(0);
newDate.setMilliseconds(0);
break;
}
return new DayUts(newDate);
}
/**
* 获取某个单位的结束时间
*/
endOf(unit: "month" | "day" | "year" | "week"): DayUts {
const newDate = new Date(this._date.getTime());
switch (unit) {
case "year":
newDate.setMonth(11);
newDate.setDate(31);
newDate.setHours(23);
newDate.setMinutes(59);
newDate.setSeconds(59);
newDate.setMilliseconds(999);
break;
case "month":
newDate.setMonth(newDate.getMonth() + 1);
newDate.setDate(0);
newDate.setHours(23);
newDate.setMinutes(59);
newDate.setSeconds(59);
newDate.setMilliseconds(999);
break;
case "week":
const day = newDate.getDay();
const diff = 6 - day;
newDate.setDate(newDate.getDate() + diff);
newDate.setHours(23);
newDate.setMinutes(59);
newDate.setSeconds(59);
newDate.setMilliseconds(999);
break;
case "day":
newDate.setHours(23);
newDate.setMinutes(59);
newDate.setSeconds(59);
newDate.setMilliseconds(999);
break;
}
return new DayUts(newDate);
}
/**
* 判断是否早于另一个日期
*/
isBefore(date: DayUts | Date | string | number): boolean {
const compareDate = this._parseDate(date);
return this._date.getTime() < compareDate.getTime();
}
/**
* 判断是否晚于另一个日期
*/
isAfter(date: DayUts | Date | string | number): boolean {
const compareDate = this._parseDate(date);
return this._date.getTime() > compareDate.getTime();
}
/**
* 判断是否与另一个日期相同
*/
isSame(date: DayUts | Date | string | number): boolean {
const compareDate = this._parseDate(date);
return this._date.getTime() == compareDate.getTime();
}
/**
* 计算与另一个日期的差值(毫秒)
*/
diff(date: DayUts | Date | string | number): number {
const compareDate = this._parseDate(date);
return this._date.getTime() - compareDate.getTime();
}
/**
* 计算与另一个日期的差值(指定单位)
*/
diffUnit(
date: DayUts | Date | string | number,
unit: "day" | "hour" | "minute" | "second" | "millisecond"
): number {
const compareDate = this._parseDate(date);
const diffMs = this._date.getTime() - compareDate.getTime();
switch (unit) {
case "day":
return Math.floor(diffMs / (1000 * 60 * 60 * 24));
case "hour":
return Math.floor(diffMs / (1000 * 60 * 60));
case "minute":
return Math.floor(diffMs / (1000 * 60));
case "second":
return Math.floor(diffMs / 1000);
case "millisecond":
default:
return diffMs;
}
}
/**
* 添加时间
*/
add(value: number, unit: "day" | "month" | "year" | "hour" | "minute" | "second"): DayUts {
const newDate = new Date(this._date.getTime());
switch (unit) {
case "year":
newDate.setFullYear(newDate.getFullYear() + value);
break;
case "month":
newDate.setMonth(newDate.getMonth() + value);
break;
case "day":
newDate.setDate(newDate.getDate() + value);
break;
case "hour":
newDate.setHours(newDate.getHours() + value);
break;
case "minute":
newDate.setMinutes(newDate.getMinutes() + value);
break;
case "second":
newDate.setSeconds(newDate.getSeconds() + value);
break;
}
return new DayUts(newDate);
}
/**
* 减少时间
*/
subtract(value: number, unit: "day" | "month" | "year" | "hour" | "minute" | "second"): DayUts {
return this.add(-value, unit);
}
/**
* 获取时间戳
*/
valueOf(): number {
return this._date.getTime();
}
/**
* 获取原生Date对象
*/
toDate(): Date {
return new Date(this._date.getTime());
}
/**
* 获取日期数组
*/
toArray(): number[] {
return [
this._date.getFullYear(),
this._date.getMonth() + 1,
this._date.getDate(),
this._date.getHours(),
this._date.getMinutes(),
this._date.getSeconds()
];
}
/**
* 私有方法:解析不同类型的日期参数
*/
private _parseDate(date: DayUts | Date | string | number): Date {
if (date instanceof DayUts) {
return date.toDate();
} else if (date instanceof Date) {
return date;
} else if (typeof date == "string") {
return new Date(date);
} else if (typeof date == "number") {
return new Date(date);
} else {
// 如果都不匹配,返回当前时间
return new Date();
}
}
}
/**
* 创建 DayUts 实例
*/
export function dayUts(date: Date | string | number | null = new Date()): DayUts {
return new DayUts(date);
}