A data é analisada de maneira diferente usando esses dois métodos configuradores.
Ao definir a data para October 31, 2015
. O método encadeado retorna 2015-10-01
enquanto o método init retorna 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/
Observe que este
$('#chained').val(moment().year(2015).month(9).date(31).format('YYYY-MM-DD'));
retorna corretamente 2015-10-31
Na verdade, o momento imita o comportamento do objeto de data JS.
Primeiro você cria moment()
que fornece a data atual (3 de novembro a partir de hoje). Você tenta definir seu dia para 31
mas novembro tem apenas 30 dias, então o objeto de data nativo JS "inteligentemente" adiciona um dia e move a data para 1º de dezembro (você pode definir o dia para qualquer número louco, como 42, e JS fará uma aritmética adicionando um número adequado de dias e retrocedendo mês e ano, se necessário, não a melhor prática, teria sido melhor se estivesse jogando).
A solução é acertar sempre ano, mês, dia, hora, minuto, nesta ordem para evitar problemas como este.
O fato sobre o manuseio de estouro é de fato documentado:
http://momentjs.com/docs/#/get -set / date /
Obtém ou define o dia do mês.
Aceita números de 1 a 31. Se o intervalo for excedido, ele borbulhará até os meses.
Embora o comportamento no caso de canto como o seu seja realmente surpreendente.
Abri um PR no repositório de documentação que explica esse problema comum
https://github.com/moment/momentjs.com/pull/244
Sim, não tenho certeza se isso pode ser corrigido. O Moment não sabe que você vai acertar o mês, então tenta acertar o dia do mês atual, que pode ou não ter 31. Ele não conhece suas intenções. Eu acho que a RP de @jakub-g é boa; vamos fazer isso.
Comentários muito úteis
Observe que este
retorna corretamente
2015-10-31
Na verdade, o momento imita o comportamento do objeto de data JS.
Primeiro você cria
moment()
que fornece a data atual (3 de novembro a partir de hoje). Você tenta definir seu dia para31
mas novembro tem apenas 30 dias, então o objeto de data nativo JS "inteligentemente" adiciona um dia e move a data para 1º de dezembro (você pode definir o dia para qualquer número louco, como 42, e JS fará uma aritmética adicionando um número adequado de dias e retrocedendo mês e ano, se necessário, não a melhor prática, teria sido melhor se estivesse jogando).A solução é acertar sempre ano, mês, dia, hora, minuto, nesta ordem para evitar problemas como este.