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/
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.
Comentario más útil
Tenga en cuenta que esto
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 en31
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.