背景
开发过程中将不同传入时间转换为时间戳,根据时间戳计算进度并渲染成进度图,但是发现部分进度点出现错位的现象。经过检查发现,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),防止时间不一致造成意料之外的结果。
【参考资料】