记录js new Date日期处理的一个坑

本文揭示了在北美东部时区使用JavaScript处理日期时遇到的一个陷阱。具体表现为new Date('2019-04-01')得到的是上个月的日期,原因是JavaScript将时间视为0时区的时间再转换为本地时间,导致月份显示错误。正确的做法是使用new Date(2019,3,1)或其他日期格式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

记录js日期处理的一个坑
 
当前时区为北美东部时区时,
new Date('2019-4-1')
new Date('2019-04-01')
结果是相关一个月的。
如下图
 
new Date('2019-04-01')
得到的日期居然是上个月
2019-03-31 20:00:00
 
原因没有深入研究
大概猜测可能是
new Date('2019-04-01'),实际对应的时间是2019-04-01 00:00:00 0时区。
然后转换为本地-4时区,就出现2019-03-31 20:00:00
得到的月份自然是上个月。
 
正确的做法
new Date('2019-4-1')
new Date(2019,3,1,0,0,0)
注意new Date(year,mon,day,hour,min,sec)中,mon月份是从0开始的,0表示1月,11表示12月。其他都正常。

转载于:https://www.cnblogs.com/zhupengfei/p/10695539.html

### JavaScript 中 Hook `new Date` 方法 为了拦截并修改 `new Date` 的行为,可以重写全局对象中的 `Date` 构造函数。这允许在每次创建新的 `Date` 对象时执行自定义逻辑。 #### 修改全局 `Date` 构造函数 通过覆盖原始的 `Date` 构造函数来实现 hook 功能: ```javascript (function () { const originalDateConstructor = Date; globalThis.Date = function (...args) { // 自定义逻辑:记录日期实例化的时间点或其他操作 console.log(`Creating a new date with arguments: ${JSON.stringify(args)}`); // 调用原生构造器创建实际的对象 if (this instanceof Date) { return Reflect.construct(originalDateConstructor, args); } return new originalDateConstructor(...args).toString(); }; // 继承原型链以保持原有功能变 Object.setPrototypeOf(globalThis.Date.prototype, originalDateConstructor.prototype); })(); ``` 上述代码片段展示了如何安全地替换掉默认的 `Date` 构造函数而破坏其原有的特性[^3]。 当应用程序尝试使用 `new Date()` 创建新实例时,会触发这段自定义逻辑,并打印出传入参数的信息到控制台。同时,仍然返回由内置构造函数生成的真实 `Date` 对象。 #### 测试 Hook 效果 可以通过简单的测试验证钩子是否生效: ```javascript const now = new Date(); // 输出当前时间戳对应的字符串形式 console.log(now); // 显示完整的 ISO8601 时间格式表示法 // 或者指定特定年份作为参数 const year2000 = new Date(2000, 0, 1); console.log(year2000); ``` 以上代码将会先显示一条消息说明正在创建一个新的 `Date` 实例及其参数列表,然后再按照常规方式输出该实例的内容。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值