JS 使用 new Date() 时间不一致问题

在使用newDate()处理日期字符串时,发现特定格式会导致时间错位至当天8点而非0点,经分析发现ISO8601格式的日期字符串会被解析为UTC时间而非本地时间。本文提供了解决方案。

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

背景

开发过程中将不同传入时间转换为时间戳,根据时间戳计算进度并渲染成进度图,但是发现部分进度点出现错位的现象。经过检查发现,new Date(date) 中传入的 date 字符串,根据时间格式的不同,可能会导致生成的时间不同(当日0点与当日8点两种情况)。

问题发现

经过检查发现,仅当传入字符串格式为 ‘2022-03-04’ 等形式的情况下,得到的时间为8点

new Date('2022-03-04')
Fri Mar 04 2022 08:00:00 GMT+0800 (中国标准时间)
new Date('2022-12-12')
Mon Dec 12 2022 08:00:00 GMT+0800 (中国标准时间)
new Date('2022-3-4')
Fri Mar 04 2022 00:00:00 GMT+0800 (中国标准时间)
new Date('2022/03/04')
Fri Mar 04 2022 00:00:00 GMT+0800 (中国标准时间)
...
问题分析及解决方法

根据查询资料,了解到原因如下:
new Date() 传入的日期字符串,需要能够被 Date.parse() 正确识别。
对 ISO 8601 格式的支持中,仅有日期的串 (例如 "1970-01-01") 会被处理为 UTC 而不是本地时间,与其他格式的串的处理不同。
因此,在日常构造日期数据的时候,注意保持日期字符串的一致性,最好使用 2022/10/01 类型的格式,保证转换后的时间在 00:00:00,或者将时间字符串均精确到秒(2022-02-02 00:00:00),防止时间不一致造成意料之外的结果。

参考资料

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值