Moment: Der Aufruf von moment.utc("2016-07-01").year(2013).toString() liefert das falsche Datum

Erstellt am 13. Okt. 2017  ·  4Kommentare  ·  Quelle: moment/moment

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

Hilfreichster Kommentar

@HolgerFrank Würde es Ihnen etwas

Edit: Ich habe die PR eingereicht, konnte es kaum erwarten.

Alle 4 Kommentare

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.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen

Verwandte Themen

ninigix picture ninigix  ·  3Kommentare

RobinvanderVliet picture RobinvanderVliet  ·  3Kommentare

slavafomin picture slavafomin  ·  3Kommentare

danieljsinclair picture danieljsinclair  ·  3Kommentare

dogukankotan picture dogukankotan  ·  3Kommentare