在js中添加迄今为止的月份

问题描述 投票:0回答:2

这是我遵循的堆栈答案:

创建:

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

这不是在日期中正确添加月份的方法吗?

堆栈答案表明它是正确的,我错过了什么吗?

javascript date date-arithmetic
2个回答
4
投票

通过调用

start.setMonth
,您最终会在这两个日期更新月份。 (这一点在您所遵循的答案的评论之一中注明,但答案本身并未注明。)

将语句分开以仅影响您想要更改的日期:

let start = new Date();
let end = new Date(start);
end.setMonth(end.getMonth() + 1);

console.log(start, end)


0
投票

简单地使用 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
© www.soinside.com 2019 - 2024. All rights reserved.