You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript中new Date(...).toISOString()一年中某一天返回结果错误

问题根因

这个结果不是代码bug,是JavaScript日期API的默认规则和夏令时(DST)切换共同作用的正常表现:

  • 当你用new Date(year, month, day)传入三个数值参数创建日期时,JS会默认取代码运行设备本地时区下,该日期的午夜0点作为时间点,不会自动按UTC时区计算。
  • toISOString() 输出的永远是UTC零时区的标准时间字符串,和本地时间的差值即时区偏移,这个偏移量在实行夏令时的地区会一年调整两次。
  • 你当前运行环境的时区,2022年的夏令时切换刚好发生在3月27日:冬令时阶段你的本地时间和UTC时间完全一致(偏移0小时),3月27日凌晨1点时钟会直接向前拨1小时到2点,进入夏令时后本地时间比UTC快1小时。

对应你跑的两段代码结果完全符合这个逻辑:

  1. 构造3月27日的日期时,取的是本地时间3月27日0点,这个时间点还没触发夏令时切换,本地时间和UTC时间相同,转ISO字符串就是2022-03-27T00:00:00.000Z。
  2. 构造3月28日的日期时,取的是本地时间3月28日0点,此时已经进入夏令时,本地时间比UTC快1小时,倒推1小时的UTC时间就是3月27日23点,所以输出2022-03-27T23:00:00.000Z。
正确写法

如果你的需求是生成固定对应ISO日期的UTC 0点时间,不要依赖本地时区构造,直接用Date.UTC传入UTC参数创建日期即可,完全不受本地时区、夏令时的影响:

// 固定生成UTC时区2022-03-28 00:00的时间对象
const bar = new Date(Date.UTC(2022, 2, 28)).toISOString()
// 输出结果恒为 2022-03-28T00:00:00.000Z

内容的提问来源于stack exchange,提问作者Obvious_Grapefruit

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 19:57:14