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小时。
对应你跑的两段代码结果完全符合这个逻辑:
- 构造3月27日的日期时,取的是本地时间3月27日0点,这个时间点还没触发夏令时切换,本地时间和UTC时间相同,转ISO字符串就是
2022-03-27T00:00:00.000Z。 - 构造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
相关产品推荐
相关产品推荐

