Без moment.js, это решение, кажется, работает хорошо.
В основном установите месяц на текущий месяц + количество месяцев.
Одна проблема, которая вызывает это, состоит в том, что добавление 1 месяцаскажем, 31-го числа, а в следующем месяце только 30, даст вам 1-е число следующего месяца.
Чтобы это исправить, вы можете проверить это. Если новый день месяца отличается от исходного, то мы переполнились, и мы можем просто установить день на 1 и вычесть 1 день, чтобы справиться с этим.
Ниже приведен пример, если вы запустите, вы также будетесм. 28 и 29 февраля с разницей високосного года.
const aday = 1000 * 60 * 60 * 24;
function addMonth(dt, m) {
const r = new Date(dt);
r.setMonth(r.getMonth() + m);
if (dt.getDate() !== r.getDate()) {
r.setDate(1);
r.setTime(r.getTime() - aday);
}
return r;
}
const first = new Date("2019-12-31");
for (let l = -10; l < 10; l += 1) {
const second = addMonth(first, l);
console.log(`${second.toDateString()} - ${l} months`);
}