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

JavaScript生成日期数组异常:结果均为结束日期后一天

问题分析与解决方案

问题根源

你这段代码的核心问题是Date对象属于引用类型:循环中currentDate始终指向同一个Date实例,每次调用setDate()只是修改这个实例的日期值,而数组里push的都是这个实例的引用。当循环结束时,这个Date实例已经被修改为2022-04-07,所以数组里的两个元素最终都指向这个最终值。

修复方案

只需要在push的时候,为当前日期创建一个独立的副本,避免后续修改影响已存入数组的元素。以下是两种简单的实现方式:

方式1:push时创建新的Date副本

修改res.push(currentDate)为res.push(new Date(currentDate)),同时循环初始化时复制一份startDate,避免修改原始的startDate变量:

let startDate = new Date("2022-04-05"); // starting date
let endDate = new Date("2022-04-06"); // ending date
let result = await cycleThroughDays(startDate, endDate);
console.log("result", result)

async function cycleThroughDays(startDate, endDate) {
    let res = [];
    // 初始化时复制startDate,避免修改原始变量
    for (let currentDate = new Date(startDate); currentDate <= endDate; currentDate.setDate(currentDate.getDate() + 1)) {
        console.log(currentDate)
        // 创建当前日期的副本存入数组
        res.push(new Date(currentDate));             
    }
    console.log(res)
    return res;
}

方式2:调整循环执行顺序

先push当前日期,再修改日期值,用while循环更直观地控制执行逻辑:

let startDate = new Date("2022-04-05"); // starting date
let endDate = new Date("2022-04-06"); // ending date
let result = await cycleThroughDays(startDate, endDate);
console.log("result", result)

async function cycleThroughDays(startDate, endDate) {
    let res = [];
    let currentDate = new Date(startDate);
    while (currentDate <= endDate) {
        console.log(currentDate)
        res.push(new Date(currentDate));
        currentDate.setDate(currentDate.getDate() + 1);
    }
    console.log(res)
    return res;
}

效果验证

修改后执行代码,输出会符合预期:

2022-04-05T00:00:00.000Z
2022-04-06T00:00:00.000Z
[ 2022-04-05T00:00:00.000Z, 2022-04-06T00:00:00.000Z ]
result [ 2022-04-05T00:00:00.000Z, 2022-04-06T00:00:00.000Z ]

内容的提问来源于stack exchange,提问作者JEFF

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 13:30:50