<p>moment.date($day).month($month).year($year) verhält sich anders als moment([$year, $month, $date])</p>

Erstellt am 2. Nov. 2015  ·  4Kommentare  ·  Quelle: moment/moment

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/

Hilfreichster Kommentar

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.

Alle 4 Kommentare

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.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen