<p>moment.date($day).month($month).year($year) se comporte différemment de moment([$year, $month, $date])</p>

Créé le 2 nov. 2015  ·  4Commentaires  ·  Source: moment/moment

La date est analysée différemment à l'aide de ces deux méthodes setter.
Lors du réglage de la date sur October 31, 2015 . La méthode chaînée renvoie 2015-10-01 tandis que la méthode init renvoie 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 Violon : http://jsfiddle.net/dgnjer7z/

Commentaire le plus utile

Notez que ce

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

renvoie correctement 2015-10-31

En fait, moment imite le comportement de l'objet date JS.

D'abord, vous créez moment() qui vous donne la date actuelle (le 3 novembre à compter d'aujourd'hui). Vous essayez de définir son jour sur 31 mais novembre n'a que 30 jours, donc l'objet de date natif JS ajoute "intelligemment" un jour et déplace la date au 1er décembre (vous pouvez définir le jour sur n'importe quel nombre fou, comme 42, et JS fera une arithmétique en ajoutant un nombre approprié de jours et en rembobinant le mois et l'année si nécessaire, pas la meilleure pratique, cela aurait été mieux s'il était en train de lancer).

La solution est de toujours régler l'année, le mois, le jour, l'heure, la minute, dans cet ordre pour éviter des problèmes comme celui-ci.

Tous les 4 commentaires

Notez que ce

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

renvoie correctement 2015-10-31

En fait, moment imite le comportement de l'objet date JS.

D'abord, vous créez moment() qui vous donne la date actuelle (le 3 novembre à compter d'aujourd'hui). Vous essayez de définir son jour sur 31 mais novembre n'a que 30 jours, donc l'objet de date natif JS ajoute "intelligemment" un jour et déplace la date au 1er décembre (vous pouvez définir le jour sur n'importe quel nombre fou, comme 42, et JS fera une arithmétique en ajoutant un nombre approprié de jours et en rembobinant le mois et l'année si nécessaire, pas la meilleure pratique, cela aurait été mieux s'il était en train de lancer).

La solution est de toujours régler l'année, le mois, le jour, l'heure, la minute, dans cet ordre pour éviter des problèmes comme celui-ci.

Le fait concernant la gestion des débordements est en effet documenté :

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

Obtient ou définit le jour du mois.

Accepte les nombres de 1 à 31. Si la plage est dépassée, elle bouillonnera jusqu'aux mois.

Bien que le comportement dans le cas du coin comme le vôtre soit en effet surprenant.

J'ai ouvert un PR dans le référentiel de documentation qui explique ce problème commun
https://github.com/moment/momentjs.com/pull/244

Oui, je ne suis pas sûr que ce soit réparable. Moment ne sait pas que vous allez régler le mois, il essaie donc de régler le jour sur le mois en cours, qui peut ou non avoir un 31. Il ignore vos intentions. Je pense que le doc PR de @jakub-g est bon; faisons cela.

Cette page vous a été utile?
0 / 5 - 0 notes