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
相关产品推荐
相关产品推荐

