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

Criado em 2 nov. 2015  ·  4Comentários  ·  Fonte: moment/moment

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/

Comentários muito úteis

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.

Todos 4 comentários

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.

Esta página foi útil?
0 / 5 - 0 avaliações