将 X 个月添加到日期的 JavaScript 函数

新手上路,请多包涵

我正在寻找将 X 个月添加到 JavaScript 日期的最简单、最干净的方法。

我宁愿不 处理这一年的滚动 或不得不 编写自己的函数

有内置的东西可以做到这一点吗?

原文由 Chad 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 841
2 个回答

以下函数将月份添加到 JavaScript ( source ) 中的日期。它考虑了年份翻转和不同的月份长度:

 function addMonths(date, months) {
 var d = date.getDate();
 date.setMonth(date.getMonth() + +months);
 if (date.getDate() != d) {
 date.setDate(0);
 }
 return date;
 }

 // Add 12 months to 29 Feb 2016 -> 28 Feb 2017
 console.log(addMonths(new Date(2016,1,29),12).toString());

 // Subtract 1 month from 1 Jan 2017 -> 1 Dec 2016
 console.log(addMonths(new Date(2017,0,1),-1).toString());

 // Subtract 2 months from 31 Jan 2017 -> 30 Nov 2016
 console.log(addMonths(new Date(2017,0,31),-2).toString());

 // Add 2 months to 31 Dec 2016 -> 28 Feb 2017
 console.log(addMonths(new Date(2016,11,31),2).toString());

上述解决方案涵盖了从天数大于目标月份的月份移动的边缘情况。例如。

  • 将十二个月添加到 2020 年 2 月 29 日(应为 2021 年 2 月 28 日)

  • 2020 年 8 月 31 日加一个月(应为 2020 年 9 月 30 日)

如果在应用 setMonth 时月份的日期发生了变化,那么我们知道由于月份长度的不同,我们已经溢出到下个月。在这种情况下,我们使用 setDate(0) 回到上个月的最后一天。

注意:此答案的此版本替换了未优雅处理不同月份长度的早期版本(如下)。

 var x = 12; //or whatever offset
 var CurrentDate = new Date();
 console.log("Current date:", CurrentDate);
 CurrentDate.setMonth(CurrentDate.getMonth() + x);
 console.log("Date after " + x + " months:", CurrentDate);

原文由 Chad 发布,翻译遵循 CC BY-SA 4.0 许可协议

我正在使用 moment.js 库进行 日期时间操作。添加一个月的示例代码:

 var startDate = new Date(...);
var endDateMoment = moment(startDate); // moment(...) can also be used to parse dates in string format
endDateMoment.add(1, 'months');

原文由 anre 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题