这是我遵循的堆栈答案:
创建:
let start = new Date(data.start_date);
let end = new Date(start.setMonth(start.getMonth() + 1));
start = start.toISOString().split('T')[0]
end = end.toISOString().split('T')[0]
console.log(start, end);
start: 2022-07-23 end: 2022-08-23
start: 2022-07-23 end: 2022-07-23
这不是在日期中正确添加月份的方法吗?
堆栈答案表明它是正确的,我错过了什么吗?
通过调用
start.setMonth
,您最终会在这两个日期更新月份。 (这一点在您所遵循的答案的评论之一中注明,但答案本身并未注明。)
将语句分开以仅影响您想要更改的日期:
let start = new Date();
let end = new Date(start);
end.setMonth(end.getMonth() + 1);
console.log(start, end)
简单地使用 getMonth()+1 可能会产生不良结果。例如,如果您正在计算按月付款的到期日,您需要确保没有跳过任何月份。 3 月 31 日加上一个月,结果就是 5 月 1 日,因为 4 月只有 30 天。
let start = new Date("31-March-2024")
let end = new Date(start)
end.setMonth(end.getMonth() + 1)
console.log(start.toString(), end.toString()) // end date is May 1
您可以通过检查开始日期和结果日期的 getDate() 值来检测这种“月份溢出”;当它们不同时,使用 0 作为该月的结果日,即溢出之前该月的最后一天。示例:
function addMonths(date, months) {
let temp = new Date(date.getFullYear(), date.getMonth() + months, date.getDate())
if (temp.getDate() == date.getDate()) {
return temp
} else { // return the last day of the month before temp
return new Date(temp.getFullYear(), temp.getMonth(), 0)
}
}
let start = new Date("31-March-2024")
console.log(start.toString(), addMonths(start, 1).toString()) // end date is April 30
console.log(start.toString(), addMonths(start, 2).toString()) // end date is May 31