Cómo agregar correctamente 1 mes a la fecha actual en moment.js

3 minutos de lectura

Avatar de usuario de Jack Moscovi
jack moscovi

Leí en la documentación de moment.js que si desea agregar 1 mes a la fecha actual, puede usar este código:

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

Pero el problema es que esto no agrega la forma en que espero que lo haga. Por ejemplo, digamos que la fecha actual es 31/10/2015 (el último día del mes de octubre). En codigo:

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 

Si observa la fecha del calendario, 1 mes/31 días desde el 31/10/2015 debería ser 1/12/2015 (el primer día de diciembre), no 30/11/2015 (el último día de noviembre).

¿Alguien podría ayudarme a solucionar este problema?

  • Supongo que lo que estás buscando es moment().add(30, "days").

    – Vikram Deshmukh

    30/10/2015 a las 16:39


  • ¿Cuál es la regla que realmente quieres? ¿Es “Añadir el número de días en el mes actual“? ¿Es “Agregar 1 mes + 1 día”?

    – Jamiec

    30/10/2015 a las 16:51


  • parece que la definición en momentjs es que si tiene fin de mes y agrega 1 mes, lo hará al final del próximo mes. Lo cual me parece muy cuerdo y predecible.

    – kio

    30/10/2015 a las 17:07

  • Un mes no siempre tiene 30 días, por lo que moment().add(30, "days") no es técnicamente la respuesta correcta.

    – SSH Esto

    31 de enero de 2017 a las 17:42

  • Por favor, no llames a las cosas no apropiadas como apropiadas. Sugiero cambiar el título de la pregunta de alguna manera. Actualmente es engañoso.

    – alehro

    1 jun 2017 a las 15:25

avatar de usuario de silentw
silencioso

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);

MANIFESTACIÓN

EDITAR

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());

MANIFESTACIÓN

  • Solo me preguntaba si este código es flexible. o simplemente soluciona el problema de la fecha actual 31/10/2015 – 1/12/2015?

    – Jack Moscovi

    30/10/2015 a las 16:47

  • Esto simplemente sale mal de otra manera: julio y agosto tienen 31 días. Cuando agrega un mes al 31 de julio, obtendrá el 1 de septiembre.

    – Jamiec

    30/10/2015 a las 16:48


  • Wow lo probé el último de enero que es el 31 y funciona perfectamente. ¡Gracias!

    – Jack Moscovi

    30/10/2015 a las 17:25


Según lo último doc puedes hacer lo siguiente-

Añadir un día

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

Agregar año

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

Añadir mes

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

  • esta respuesta es incorrecta y no agrega correctamente un mes de acuerdo con la solicitud anterior

    – Eike Thies

    6 de noviembre de 2019 a las 22:22

  • Probar moment('2020-03-30').add(1, 'months') y luego comparar con moment('2020-03-31').add(1, 'months'). El resultado será el mismo, lo cual es incorrecto.

    – Tomasz Kasperczyk

    31 de marzo de 2020 a las 18:17

  • @TomaszKasperczyk pl. informe aquí – github.com/momento/momento/problemas

    – Anoop M Maddasseri

    2 de febrero de 2021 a las 13:11

Avatar de usuario de Nishith
Nishit

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>

  • Si bien este código puede responder la pregunta, proporcionar contexto adicional sobre cómo y/o por qué resuelve el problema mejoraría el valor a largo plazo de la respuesta.

    –Piotr Labunski

    19 de marzo de 2020 a las 8:41

  • Dice agregar 1 mes y agregas 4 días

    – Ahmet Firat Keler

    3 de noviembre a las 14:08

Tu podrías intentar

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

¿Ha sido útil esta solución?