JavaScript中如何跨月/年正确从日期减去指定天数?
解决跨月/跨年的日期减法问题
你当前的代码逻辑有问题,不是setDate不支持跨月跨年——实际上JavaScript的Date.prototype.setDate()方法本身就会自动处理跨月、跨年的日期计算,问题出在你没有基于endDate来创建日期副本,而是用了当前时间的新Date实例去修改。
错误原因分析
你的原代码逻辑错误点:
let startDate = new Date(); // 创建的是当前时间的Date对象 startDate.setDate(endDate.getDate() - 2); // 用endDate的日期数修改当前时间的日期,逻辑完全偏离需求
比如endDate是1月1日,endDate.getDate()-2得到-1,这时候把这个值设置给当前时间的Date,结果会是当前月份的倒数第二天,而不是endDate往前推2天的目标日期。
正确实现代码
只需要先复制endDate的副本,再调用setDate减2天即可:
// 复制endDate的实例,避免修改原日期对象 const startDate = new Date(endDate); // 直接减去2天,setDate会自动处理跨月/跨年 startDate.setDate(startDate.getDate() - 2);
验证示例
- 如果
endDate是2024-01-01(闰年),执行后startDate是2023-12-30 - 如果
endDate是2024-03-01,执行后是2024-02-28 - 如果
endDate是2023-03-01,执行后是2023-02-27 - 如果
endDate是2024-12-31,执行后是2024-12-29
不管跨月还是跨年,setDate都会自动调整月份和年份,完全不需要额外处理。
内容的提问来源于stack exchange,提问作者DanielG
相关产品推荐
相关产品推荐

