Búsqueda de sitios web

javascript - ¿Cómo copiar el valor del mes de un objeto Date a otro?


Dados dos objetos Date, ¿cómo establecer correctamente el mes del primer objeto al mes de otro?

Me enfrento a la tarea de copiar el día, mes y año de un objeto Date a otro. Copiar el día y el año funciona como se espera, el problema surge cuando intento copiar el mes.

Usar b.setMonth(a.getMonth()) resulta en que b tenga su mes de más por uno.

Sin embargo, usar b.setMonth(a.getMonth() - 1) resulta en que b tenga un mes menos del requerido.

El siguiente código TypeScript:

      let a = new Date(2018, 1, 12);
      let b = new Date();
      console.log(a);
      console.log(b);

      console.log('====');
      console.log(a.getMonth());
      console.log(b.getMonth());

      b.setMonth(a.getMonth());

      console.log('====');
      console.log(a.getMonth());
      console.log(b.getMonth());


      b.setMonth(a.getMonth() - 1);

      console.log('====');
      console.log(a.getMonth());
      console.log(b.getMonth());

Devoluciones :

Mon Feb 12 2018 00:00:00 GMT+0100
Thu Aug 29 2019 16:11:03 GMT+0200
====
1
7
====
1
2
====
1
0                  // 2 - 1 = 0 ?

Aparentemente 2 - 1 debería dar 1 (a.getMonth() - 1), pero aparentemente los objetos Date se comportan de manera diferente. ¿Cuál es la forma correcta de copiar el mes de un objeto Date a otro en JavaScript/TypeScript? Supongo que convertir ambas fechas a cadena, copiar los caracteres correctos y analizar la cadena de nuevo a Date funcionaría, pero me pregunto si hay un enfoque más fácil y limpio.

Respuesta #1

El problema es que el método setMonth() tiene un segundo parámetro opcional que es el día (DOCS). Si no proporcionas un valor para el día, automáticamente se utilizará el del fecha.

Entonces, tu fecha A es el 12 de febrero de 2018 mientras que tu fecha B es el 29 de agosto de 2019.

Al hacer b.setMonth(a.getMonth()); estás diciendo implícitamente b.setMonth(1,29); (1 es a.getMonth() mientras que 29 es el día de la fecha b).

Entonces estás intentando establecer la fecha al 29 de febrero, lo cual no es posible en 2019 y desplaza el mes en 1 a marzo (mes 2).

Si haces b.setMonth(a.getMonth() -1); lo estás configurando al 29 de enero, lo cual es posible, por lo que obtienes enero como mes (mes 1).

Respuesta #2

Es porque es tu día de suerte (¡o de mala suerte!). Son las fechas particulares con las que estás trabajando.

Febrero solo tiene 28 días este año. Cuando configuras el mes de "29 de agosto de 2019" a febrero, estás tratando de crear la fecha no válida "29 de febrero de 2019". Eso se redondea a "1 de marzo de 2019".

Si hubieras intentado este experimento ayer, no habrías visto este problema.

Artículos relacionados