Das Datum wird mit diesen beiden Setter-Methoden unterschiedlich geparst.
Beim Einstellen des Datums auf October 31, 2015
. Die verkettete Methode gibt 2015-10-01
während die init-Methode 2015-10-31
zurückgibt
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-Geige: http://jsfiddle.net/dgnjer7z/
Beachten Sie, dass dies
$('#chained').val(moment().year(2015).month(9).date(31).format('YYYY-MM-DD'));
gibt 2015-10-31
properly richtig zurück
Tatsächlich ahmt moment das Verhalten von JS-Datumsobjekten nach.
Zuerst erstellen Sie moment()
, das Ihnen das aktuelle Datum (3. November ab heute) liefert. Sie versuchen, den Tag auf 31
aber der November hat nur 30 Tage, also fügt das native JS-Datumsobjekt "intelligent" einen Tag hinzu und verschiebt das Datum auf den 1. und JS führt eine Arithmetik durch, indem es eine angemessene Anzahl von Tagen hinzufügt und bei Bedarf Monat und Jahr zurückschaltet, nicht die beste Vorgehensweise, es wäre besser gewesen, wenn es geworfen hätte).
Die Lösung besteht darin , Jahr, Monat, Tag, Stunde, Minute immer in dieser Reihenfolge einzustellen, um solche Probleme zu vermeiden.
Die Tatsache über die Überlaufbehandlung ist tatsächlich dokumentiert:
http://momentjs.com/docs/#/get -set/date/
Ruft den Tag des Monats ab oder legt diesen fest.
Akzeptiert Zahlen von 1 bis 31. Wenn der Bereich überschritten wird, wird er bis zu den Monaten angezeigt.
Obwohl das Verhalten in einem Eckfall wie Ihrem in der Tat überraschend ist.
Ich habe eine PR im Dokumentations-Repository geöffnet, in der dieses häufige Problem erklärt wird.
https://github.com/moment/momentjs.com/pull/244
Ja, ich bin mir nicht sicher, ob das behoben werden kann. Moment weiß nicht, dass Sie den Monat einstellen werden, also versucht es, den Tag auf den aktuellen Monat einzustellen, der eine 31 haben kann oder nicht. Es ist sich Ihrer Absichten nicht bewusst. Ich finde die PR von @jakub-g gut; Lass uns das tun.
Hilfreichster Kommentar
Beachten Sie, dass dies
gibt
2015-10-31
properly richtig zurückTatsächlich ahmt moment das Verhalten von JS-Datumsobjekten nach.
Zuerst erstellen Sie
moment()
, das Ihnen das aktuelle Datum (3. November ab heute) liefert. Sie versuchen, den Tag auf31
aber der November hat nur 30 Tage, also fügt das native JS-Datumsobjekt "intelligent" einen Tag hinzu und verschiebt das Datum auf den 1. und JS führt eine Arithmetik durch, indem es eine angemessene Anzahl von Tagen hinzufügt und bei Bedarf Monat und Jahr zurückschaltet, nicht die beste Vorgehensweise, es wäre besser gewesen, wenn es geworfen hätte).Die Lösung besteht darin , Jahr, Monat, Tag, Stunde, Minute immer in dieser Reihenfolge einzustellen, um solche Probleme zu vermeiden.