JS生成日期序列时跳过2023-10-29的原因及解决方法
解决JavaScript生成日期序列时因夏令时缺失日期的问题
问题根源
2023年10月29日的缺失确实是夏令时转换导致的。以欧洲部分时区(如英国、中欧)为例,当天凌晨时钟会从2点回拨到1点,本地时区这一天有25小时。你原代码中使用setDate()、getDate()这类本地时区相关方法时,JavaScript Date对象会因为时区偏移的突变,导致日期计算出现跳变,最终生成的UTC格式日期跳过了2023-10-29。
修复方案:全程基于UTC处理日期
UTC时间没有夏令时转换,时间线完全连续,改用UTC相关方法就能彻底解决这个问题。修改后的代码如下:
let data = { "2024-03-01": 4, "2024-03-02": 1, "2024-03-03": 3, "2024-03-04": 6, "2024-03-05": 2, "2024-03-06": 0, "2024-03-07": 5, "2024-03-08": 1, "2024-03-09": 3 } function adjustDataToHave365days(data) { // 强制以UTC解析日期,避免本地时区干扰 const dates = Object.keys(data).map(dateStr => new Date(`${dateStr}T00:00:00Z`)); const firstDate = dates[0]; let startDate = new Date(firstDate); // 用UTC方法计算起始日期 startDate.setUTCDate(startDate.getUTCDate() - (365 - dates.length)); const result = {}; let currentDate = new Date(startDate); while (currentDate <= firstDate) { const formattedDate = currentDate.toISOString().split('T')[0]; result[formattedDate] = 0; // 用UTC方法递增日期 currentDate.setUTCDate(currentDate.getUTCDate() + 1); } // 覆盖原有数据 Object.keys(data).forEach(date => { result[date] = data[date]; }); return result; } console.log(adjustDataToHave365days(data))
核心修改说明
- 日期解析:通过
${dateStr}T00:00:00Z后缀强制Date对象以UTC时间解析日期字符串,避免本地时区自动转换带来的偏移误差。 - 日期操作:将所有
setDate()/getDate()替换为setUTCDate()/getUTCDate(),所有日期计算都基于UTC时间线,彻底规避夏令时的影响。 - 日期格式化:保留
toISOString().split('T')[0],因为它输出的是标准UTC日期字符串,和你输入的日期格式完全匹配。
修改后生成的日期序列会完整包含2023年10月29日,不会再出现夏令时导致的日期缺失问题。
内容的提问来源于stack exchange,提问作者Dreamer DeLy
相关产品推荐
相关产品推荐

