<p>moment.date ($ day) .month ($ month) .year ($ year) se comporta de manera diferente al momento ([$ year, $ month, $ date])</p>

Creado en 2 nov. 2015  ·  4Comentarios  ·  Fuente: moment/moment

La fecha se analiza de forma diferente utilizando estos dos métodos de establecimiento.
Al establecer la fecha en October 31, 2015 . El método encadenado devuelve 2015-10-01 mientras que el método init devuelve 2015-10-31

var year = 2015;
var month = 9; //october
var day = 31;

console.log(moment().date(day).month(month).year(year).format('YYYY-MM-DD'));
//2015-10-01

console.log(moment([year, month, day]).format('YYYY-MM-DD'));
//2015-10-31

JS Fiddle: http://jsfiddle.net/dgnjer7z/

Comentario más útil

Tenga en cuenta que esto

$('#chained').val(moment().year(2015).month(9).date(31).format('YYYY-MM-DD'));

devuelve correctamente 2015-10-31

De hecho, el momento imita el comportamiento del objeto de fecha JS.

Primero crea moment() que le da la fecha actual (3 de noviembre a partir de hoy). Intenta establecer su día en 31 pero noviembre tiene solo 30 días, por lo que el objeto de fecha nativo de JS agrega "inteligentemente" un día y mueve la fecha al 1 de diciembre (puede establecer el día en cualquier número loco, como 42, y JS hará una aritmética agregando un número adecuado de días y rebobinando mes y año si es necesario, no es la mejor práctica, hubiera sido mejor si estuviera lanzando).

La solución es configurar siempre año, mes, día, hora, minuto, en este orden para evitar problemas como este.

Todos 4 comentarios

Tenga en cuenta que esto

$('#chained').val(moment().year(2015).month(9).date(31).format('YYYY-MM-DD'));

devuelve correctamente 2015-10-31

De hecho, el momento imita el comportamiento del objeto de fecha JS.

Primero crea moment() que le da la fecha actual (3 de noviembre a partir de hoy). Intenta establecer su día en 31 pero noviembre tiene solo 30 días, por lo que el objeto de fecha nativo de JS agrega "inteligentemente" un día y mueve la fecha al 1 de diciembre (puede establecer el día en cualquier número loco, como 42, y JS hará una aritmética agregando un número adecuado de días y rebobinando mes y año si es necesario, no es la mejor práctica, hubiera sido mejor si estuviera lanzando).

La solución es configurar siempre año, mes, día, hora, minuto, en este orden para evitar problemas como este.

El hecho sobre el manejo del desbordamiento está efectivamente documentado:

http://momentjs.com/docs/#/get -set / date /

Obtiene o establece el día del mes.

Acepta números del 1 al 31. Si se excede el rango, aumentará hasta los meses.

Aunque el comportamiento en el caso de la esquina como el suyo es realmente sorprendente.

Abrí un PR en el repositorio de documentación que explica este problema común
https://github.com/moment/momentjs.com/pull/244

Sí, no estoy seguro de que esto se pueda arreglar. Moment no sabe que vas a configurar el mes, por lo que intenta configurar el día en el mes actual, que puede tener o no 31. Es ignorante de tus intenciones. Creo que el doc PR de @ jakub-g es bueno; vamos a hacer eso.

¿Fue útil esta página
0 / 5 - 0 calificaciones