如何在moment.js中将一个月正确地加到当前日期?

90

我在moment.js的文档中读到,如果您想将1个月添加到当前日期,可以使用以下代码:

var moment = require('moment');
var futureMonth = moment().add(1, 'M').format('DD-MM-YYYY');

但问题是它并没有按照我期望的方式增加。例如,假设当前日期为2015年10月31日(十月的最后一天)。在代码中:

var currentDate = moment().format('DD-MM-YYYY');
var futureMonth = moment().add(1, 'M').format('DD-MM-YYYY');

console.log(currentDate) //  Result --> 31/10/2015
console.log(futureMonth) //  Result --> 30/11/2015 

如果你看一下日历日期,从2015年10月31日开始一个月/ 31天应该是到2015年12月1日(12月的第一天),而不是2015年11月30日(11月的最后一天)。

有人可以帮我解决这个问题吗?


8
我猜你想要的是 moment().add(30, "days") - Vikram Deshmukh
3
你真正想要的规则是什么?是“加上当前月份中的天数”吗?还是“加上1个月再加1天”? - Jamiec
8
在momentjs中,如果你有月底并添加了1个月,它的定义似乎是会变成下个月底。这对我来说似乎非常明智和可预测。 - kio
3
一个月的长度并不总是30天,所以 moment().add(30, "days") 不是严格正确的答案。 - SSH This
8
请勿将不当的事物称为适当的事物。我建议以某种方式更改问题的标题。当前标题具有误导性。 - alehro
显示剩余8条评论
4个回答

128
var currentDate = moment('2015-10-30');
var futureMonth = moment(currentDate).add(1, 'M');
var futureMonthEnd = moment(futureMonth).endOf('month');

if(currentDate.date() != futureMonth.date() && futureMonth.isSame(futureMonthEnd.format('YYYY-MM-DD'))) {
    futureMonth = futureMonth.add(1, 'd');
}

console.log(currentDate);
console.log(futureMonth);

演示

编辑

moment.addRealMonth = function addRealMonth(d) {
  var fm = moment(d).add(1, 'M');
  var fmEnd = moment(fm).endOf('month');
  return d.date() != fm.date() && fm.isSame(fmEnd.format('YYYY-MM-DD')) ? fm.add(1, 'd') : fm;  
}

var nextMonth = moment.addRealMonth(moment());

演示


请问这段代码是灵活的吗?还是只是解决当前日期问题31/10/2015 - 1/12/2015? - Jack Moscovi
5
另一个问题出现了——七月和八月都有31天。当你给7月31日加一个月时,会得到9月1日。 - Jamiec
哇,我在1月的最后一天测试了一下,也就是31号,结果完美运行。谢谢! - Jack Moscovi

65

根据最新的文档,您可以执行以下操作 -

增加一天

moment().add(1, 'days').calendar();

增加年份

moment().add(1, 'years').calendar();

添加月份

moment().add(1, 'months').calendar();

2
这个答案是错误的,没有根据上述要求正确地增加一个月。 - Eike Thies
尝试运行 moment('2020-03-30').add(1, 'months'),然后与 moment('2020-03-31').add(1, 'months') 进行比较。结果将会相同,这是错误的。 - Tomasz Kasperczyk
@TomaszKasperczyk 请在此处报告 - https://github.com/moment/moment/issues - Anoop M Maddasseri

4

startDate = "20.03.2020";
var newDate = moment(startDate, "DD-MM-YYYY").add(5, 'days');
console.log(newDate)
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.18.1/moment.min.js"></script>


1
虽然这段代码可能回答了问题,但提供有关它如何以及/或为什么解决问题的附加上下文将改善答案的长期价值。 - Piotr Labunski
它说要加1个月,而你却加了4天。 - Ahmet Firat Keler

3

您可以尝试

moment().add(1, 'M').subtract(1, 'day').format('DD-MM-YYYY')

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接