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

JavaScript中日期加法出现异常结果的问题排查

问题分析与解决办法

嘿,我一眼就瞅出你代码里的问题啦!核心错误在于你每次计算下一个日期时,都在拿原始的start日期(也就是1号)加7,而不是基于当前的nextDay日期来累加7天。

咱们拆解下你的代码逻辑:

var start = new Date('2018-01-01');
var nextDay = new Date(start);
for (day = 1; day <= 5; day++) {
  console.log("start day "+nextDay.toUTCString());
  nextDay.setDate(start.getDate()+7); // 这里就是bug根源!
  console.log("The next day is:"+nextDay.toUTCString());
}

你每次调用nextDay.setDate(start.getDate()+7),都是用start固定的1号加7得到8,然后把nextDay的日期设为8。第一次执行时,nextDay是1月1日,改成8号没问题;但第二次循环时,nextDay已经是1月8日了,你再强行把日期设为8——如果遇到时区差异或者日期处理的边界情况,就会意外跳转到下个月的8号,也就是你看到的2月8日。

修正后的代码

只需要把start.getDate()+7改成nextDay.getDate()+7,让每次的7天都基于当前的nextDay日期累加就行:

var start = new Date('2018-01-01');
var nextDay = new Date(start);
for (day = 1; day <= 5; day++) {
  console.log("start day "+nextDay.toUTCString());
  nextDay.setDate(nextDay.getDate() + 7); // 改成基于当前日期累加7天
  console.log("The next day is:"+nextDay.toUTCString());
}

运行后就能得到你预期的按周递增结果:

start day Mon, 01 Jan 2018 00:00:00 GMT
The next day is: Mon, 08 Jan 2018 00:00:00 GMT
start day Mon, 08 Jan 2018 00:00:00 GMT
The next day is: Mon, 15 Jan 2018 00:00:00 GMT
start day Mon, 15 Jan 2018 00:00:00 GMT
The next day is: Mon, 22 Jan 2018 00:00:00 GMT
...

另外补充个小知识点:JavaScript的Date对象setDate()方法很智能,就算你设置的日期超过当前月份的天数,它会自动调整到对应下个月(比如1月31日加7天,会自动变成2月7日),完全不用操心跨月的问题~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 10:00:31