封装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;
这是自用,可能存在一些问题,发现后再处理