| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303 |
- /**
- * 轻量级日期工具类
- * 基于 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;
- }
- /**
- * 获取某个单位的开始时间
- */
- 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);
- }
|