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

对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;

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

http://www.xdnf.cn/news/3372.html

相关文章:

  • django_rq
  • Unity编辑器扩展之导出项目中所有Script里面的文本内容
  • 《Python实战进阶》No45:性能分析工具 cProfile 与 line_profiler
  • 【SLAM】svo 的深度滤波和 msckf 的后端的点的优化的差异是什么?delayinit和depthfilter之间的差异是什么?
  • 多帧Dicom文件获取ImagePosition、Intercept、Slope、PixelSpacing
  • AndroidStudio生成AAR
  • 网页工具箱 --- 一个强大的浏览器脚本工具
  • 前端开发 Markdown 编辑器与富文本编辑器详解
  • 长尾关键词SEO优化策略精解
  • Vcpkg C++库管理工具安装
  • Azure AI Foundry实战:从零开始构建智能应用
  • 关于 live555延迟优化之缓存区优化“StreamParser::afterGettingBytes() warning: read”” 的解决方法
  • 晶振:从消费电子到航天领域的时间精度定义者
  • Git仓库目录的所有权问题
  • 2025 新生 DL-FWI 培训
  • Web开发-JavaEE应用SpringBoot栈模版注入ThymeleafFreemarkerVelocity
  • Antd Upload组件连续回车会多次触发文件夹弹窗的bug修复
  • MATLAB绘制饼图(二维/三维)
  • 如何解决服务器文件丢失或损坏的问题
  • linux中systemctl stop 和 kill -9的区别
  • 字节暑期实习-网络运维工程师面经
  • Java学习计划与资源推荐(入门到进阶、高阶、实战)
  • 从 PID 到 Agent:工业控制算法的五代进化史与智能协同革命
  • CentOS网络之network和NetworkManager深度解析
  • 小刚说C语言刷题—1462小明的游泳时间
  • spring中关键字Assert和jdk的assert关键字
  • finereport普通报表设置冻结列后实现点击单元格整行背景变色
  • Kaamel白皮书:MCP安全实践
  • 司南评测集社区 4 月上新一览
  • 宝塔面板运行docker的jenkins