JavaScript中为Date对象添加指定天数未得到预期结果如何排查?
代码错误定位
- 初始化
xDate时使用new Date(),会直接生成代表代码运行时刻本地系统时间的Date实例,和你要计算的currentDate没有任何关联 - 后续执行的
xDate.setDate(currentDate.getDate() + offset)操作,是把「原始日期的日值加45」作为参数,作用在这个无关的当前时间对象上,完全没有以currentDate为基准做日期偏移,最终结果自然和预期偏差极大
修正方案
先基于currentDate创建独立的时间副本,再在副本上执行天数累加操作,全程不受当前系统时间干扰:
var currentDate = new Date("2021-04-27T15:30:27.588+0000"); console.log(currentDate); // 输出 Wed Apr 28 2021 00:00:00 GMT+1000 (Australian Eastern Standard Time) var offset = 45; // 基于currentDate的时间戳生成完全一致的日期副本 var xDate = new Date(currentDate.getTime()); // 在副本上累加天数,Date对象会自动处理跨月、跨年的进位逻辑 xDate.setDate(xDate.getDate() + offset); console.log(xDate);
运行结果验证
修正后代码输出的日期为Sat Jun 12 2021 00:00:00 GMT+1000 (Australian Eastern Standard Time),是6月的日期,完全符合预期。
- 通过时间戳初始化副本的方式,不会修改原
currentDate对象,适合需要保留原始日期值的场景 - 原生
setDate方法本身已内置跨月、跨年的自动进位逻辑,不需要手动计算每月天数做偏移
内容的提问来源于stack exchange,提问作者Vik G
相关产品推荐
相关产品推荐

