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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 15:03:19