当前位置: 首页 > news >正文

对js的Date二次封装,继承了原Date的所有方法,增加了自己扩展的方法,可以实现任意时间往前往后推算多少小时、多少天、多少周、多少月;

封装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;

这是自用,可能存在一些问题,发现后再处理

相关文章:

  • 使用atomic实现无锁方式的全局变量访问
  • 借助电商 API 接口实现电商平台商品数据分析的详细步骤分享
  • Python第四周作业
  • 力扣-数组-238 除自身以外数组的乘积
  • tbb parallel_for 使用教程2之 tbb::blocked_range
  • 【Android】Android签名解析
  • javascript 深拷贝和浅拷贝的区别及具体实现方案
  • 双指针(4)——盛水最多的容器
  • Vcpkg C++库管理工具安装
  • Depth Anything V2:深度万象 V2
  • 前端js学算法-实践
  • 可编辑25页PPT | 企业数字底座:数据中台构建路径、方法和实践
  • Vue3源码学习3-结合vitetest来实现mini-vue
  • Java ResourceBundle 资源绑定详解
  • linux find命令妙用
  • Kettle下载安装教程
  • Set系列之HashSet源码分析:原理剖析与实战对比
  • Ubuntu 24.04 终端美化
  • 强化学习之基于无模型的算法之基于值函数的深度强化学习算法
  • 望获实时Linux系统荣获人形机器人技术突破奖
  • 剑指3000亿产业规模,机器人“武林大会”背后的无锡“野望”
  • 两部门预拨4000万元支持山西、广西、陕西做好抗旱救灾工作
  • “面具女孩”多次恐吓电梯内两幼童,当事女孩及家长道歉后获谅解
  • 李乐成任工业和信息化部部长
  • 庄语乐︱宋代历史是被“塑造”出来的吗?
  • 特朗普执政百日集会吹嘘政绩,美国消费者信心指数跌至疫情以来最低