封装js时间工具
概述
该方法继承了 js 中 Date的所有方法;同时扩展了一部分自用方法:
1、任意时间 往前推多少小时,天,月,周;参数1、2必填,参数3可选
beforeDate(num,formatter,dateVal);
beforeMonth(num,formatter,dateVal);
beforeWeek(num,formatter,dateVal);
beforeHour(num,formatter,dateVal);
2、任意时间 往后推多少小时,天,月,周;参数1、2必填,参数3可选
afterDate(num,formatter,dateVal);
aftereMonth(num,formatter,dateVal);
afterWeek(num,formatter,dateVal);
afterHour(num,formatter,dateVal);
使用方法
1、导入:
import myDate from './myDate.js';
2、初始化:
const myDateTool = new myDate(); // 参数可选
3、使用:
/*
formatter时间格式如下:
YYYY-MM-DD、YYYY-MM-DD hh、YYYY-MM-DD hh:mm、YYYY-MM-DD hh:mm:ss
*/
//方法名(num,formatter,dateVal)
//num 数字,formatter希望返回的日期格式,dateVal日期(可选)
/**************************往前推算*****************************/
//示例1 获取5天前的日期
console.log(tool.beforeDate(5, 'YYYY-MM-DD','2025-04-29'));
//2025-04-24
//示例2 获取3月前的日期
console.log(tool.beforeMonth(2, 'YYYY-MM-DD hh','2025-04-29'));
//2025-03-01 17 2月只有28天,所以推算到3月1日
//示例3 获取2周前的日期
console.log(tool.beforeWeek(2, 'YYYY-MM-DD hh:mm','2025-04-29'));
//2025-04-15 17:13
//示例4 获取20小时前的日期
console.log(tool.beforeHour(20, 'YYYY-MM-DD hh:mm:ss','2025-04-29'));
//2025-04-28 21:16:33
/**************************往后推算*****************************/
//示例1 获取2天后的日期
console.log(tool.afterDate(2, 'YYYY-MM-DD','2025-04-29'));
//2025-05-01
//示例2 获取1个月后的日期
console.log(tool.afterMonth(1, 'YYYY-MM-DD hh','2025-04-29'));
//2025-05-29 17
//示例3 获取3周后的日期
console.log(tool.afterWeek(3, 'YYYY-MM-DD hh:mm','2025-04-29'));
//2025-05-20 17:18
//示例4 获取12小时后的日期
console.log(tool.afterHour(12, 'YYYY-MM-DD hh:mm:ss','2025-04-29'));
//2025-04-30 05:18:08
具体代码如下
class myDate extends Date {
constructor(date) {
super(date || new Date());
}
// 私有方法:检查日期字符串是否包含时间部分
_hasTimePart(dateString) {
return /[\sT]\d{1,2}:\d{2}/.test(dateString);
}
// 私有格式化方法
_format(date, formatter) {
const year = date.getFullYear();
const month = String(date.getMonth() + 1).padStart(2, '0');
const day = String(date.getDate()).padStart(2, '0');
const hours = String(date.getHours()).padStart(2, '0');
const minutes = String(date.getMinutes()).padStart(2, '0');
const seconds = String(date.getSeconds()).padStart(2, '0');
return formatter
.replace(/YYYY/g, year)
.replace(/MM/g, month)
.replace(/DD/g, day)
.replace(/hh/g, hours)
.replace(/mm/g, minutes)
.replace(/ss/g, seconds);
}
// 通用时间计算方法
_calculateTime(unit, num, formatter, dateVal, isBefore = true) {
let baseDate;
if (dateVal !== undefined) {
baseDate = new Date(dateVal);
// 检查是否为字符串且不含时间部分
if (typeof dateVal === 'string' && !this._hasTimePart(dateVal)) {
const now = new Date();
baseDate.setHours(now.getHours());
baseDate.setMinutes(now.getMinutes());
baseDate.setSeconds(now.getSeconds());
baseDate.setMilliseconds(now.getMilliseconds());
}
} else {
baseDate = new Date(this.getTime());
}
const newDate = new Date(baseDate);
const modifier = isBefore ? -num : num;
switch (unit) {
case 'date':
newDate.setDate(newDate.getDate() + modifier);
break;
case 'month':
newDate.setMonth(newDate.getMonth() + modifier);
break;
case 'hour':
newDate.setHours(newDate.getHours() + modifier);
break;
}
return this._format(newDate, formatter);
}
// 各时间计算方法保持不变
beforeDate(num, formatter, dateVal) {
return this._calculateTime('date', num, formatter, dateVal);
}
beforeMonth(num, formatter, dateVal) {
return this._calculateTime('month', num, formatter, dateVal);
}
beforeWeek(num, formatter, dateVal) {
return this.beforeDate(num * 7, formatter, dateVal);
}
beforeHour(num, formatter, dateVal) {
return this._calculateTime('hour', num, formatter, dateVal);
}
afterDate(num, formatter, dateVal) {
return this._calculateTime('date', num, formatter, dateVal, false);
}
afterMonth(num, formatter, dateVal) {
return this._calculateTime('month', num, formatter, dateVal, false);
}
afterWeek(num, formatter, dateVal) {
return this.afterDate(num * 7, formatter, dateVal);
}
afterHour(num, formatter, dateVal) {
return this._calculateTime('hour', num, formatter, dateVal, false);
}
}
export default myDate;
这是自用,可能存在一些问题,发现后再处理