Beschreibung des Problems und Schritte zur Reproduktion:
Es scheint, als würde das ausgegebene Datum auf das Ende des Monats verschoben, wenn das Datum auf ein Datum in der Vergangenheit und dann das Jahr auf einen beliebigen Wert eingestellt wird.
Wenn Sie moment.utc("2016-07-01").year(2013).toString()
anrufen, erhalten Sie Wed Jul 31 2013 00:00:00 GMT+0000
. Beachten Sie, dass es der 31. Juli und nicht der 01. Juli ist.
Umfeld:
Ich habe dies sowohl in Chrome 61 als auch in Node 5.10.1 reproduziert
Weitere Informationen, die hilfreich sein können:
Dies scheint nur ein Problem zu sein, wenn Sie ein Datum aus dem Jahr 2016 verwenden. Wenn Sie moment.utc("2015-07-01").year(2013).toString()
versuchen, funktioniert es einwandfrei.
Ich kann bestätigen, dass dies kein Problem vor Moment 2.19.0+ ist. Es ist nur ein Problem ab 2.19.0+
Wenn Sie ein Problem melden, führen Sie den folgenden Code in der von Ihnen verwendeten Umgebung aus und fügen Sie die Ausgabe ein:
console.log( (new Date()).toString())
console.log((new Date()).toLocaleString())
console.log( (new Date()).getTimezoneOffset())
console.log( navigator.userAgent)
console.log(moment.version)
Thu Oct 12 2017 23:10:36 GMT-0300 (ADT)
10/12/2017, 11:10:36 PM
180
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36
2.19.1
In Version 2.19.0 wurde die Funktion set$1() geändert.
Aufgrund dieser Änderung, die ein neues Jahr für einen Schaltjahr-Moment festlegt, wird immer der letzte Tag des Monats als Datum festgelegt.
moment('2010-02-25').year(2017) // result is: 2017-02-28
moment('2010-10-15').year(2017) // result is: 2017-10-31
Aktuelle (falsche) Implementierung
function set$1 (mom, unit, value) {
if (mom.isValid() && !isNaN(value)) {
if (unit === 'FullYear' && isLeapYear(mom.year())) {
mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](value, mom.month(), daysInMonth(value, mom.month()));
}
else {
mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](value);
}
}
}
Da der Sonderfall in Schaltjahren nur für den 29. Februar benötigt wird, sollte die korrekte Implementierung lauten:
function set$1 (mom, unit, value) {
if (mom.isValid() && !isNaN(value)) {
if (unit === 'FullYear' && isLeapYear(mom.year()) && mom.month() === 1 && mom.date() === 29) {
mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](value, 1, daysInMonth(value, 1));
}
else {
mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](value);
}
}
}
Da es sich um einen kritischen Fehler handelt, sollte dieser so schnell wie möglich korrigiert werden.
Entschuldigung, dass ich gerade bemerkt habe, dass ich geschrieben habe "Ich kann bestätigen, dass dies kein Problem vor 1.19.0+ ist. Es ist nur ein Problem ab 1.19.0+", aber ich meinte eigentlich 2.19 ... ich habe dies im ursprünglichen Beitrag aktualisiert
@HolgerFrank Würde es Ihnen etwas
Edit: Ich habe die PR eingereicht, konnte es kaum erwarten.
Schluss zu Gunsten der PR.
Hilfreichster Kommentar
@HolgerFrank Würde es Ihnen etwas
Edit: Ich habe die PR eingereicht, konnte es kaum erwarten.