"Verfallswarnung: Momentkonstruktion fällt auf js Datum zurück", wenn versucht wird, das RFC2822-Datum in moment.js zu konvertieren

164

Ich verwende den folgenden Code, um eine serverseitige Datums- und Uhrzeitangabe mit moment.js in die Ortszeit umzuwandeln.

 moment(moment('Wed, 23 Apr 2014 09:54:51 +0000').format('lll')).fromNow()

Aber ich bekomme:

Verfallswarnung: Moment Bau fällt auf js Datum zurück. Dies wird nicht empfohlen und wird in der kommenden Hauptversion entfernt. Weitere Informationen finden Sie unter https://github.com/moment/moment/issues/1407 .

Es scheint, ich kann es nicht loswerden! Wie kann ich es reparieren?

Dariush
quelle
Hast du gelesen, wo es heißt?
Toesslab
7
Natürlich habe ich gelesen !! aber entweder bin ich verwirrt und konnte keine Lösung finden oder es gab überhaupt keine Lösung darin!
Dariush
Nachdem ich dort ein bisschen gelesen habe, scheint es ein echtes Problem zu sein, das vor Monaten besprochen wurde ... Nehmen Sie ein anderes Werkzeug ...
toesslab

Antworten:

315

Um die Warnung loszuwerden, müssen Sie entweder:

  • Übergeben Sie eine ISO-formatierte Version Ihrer Datumszeichenfolge:

    moment('2014-04-23T09:54:51');

  • Übergeben Sie die Zeichenfolge, die Sie jetzt haben, und teilen Sie Moment mit, in welchem ​​Format die Zeichenfolge vorliegt:

    moment('Wed, 23 Apr 2014 09:54:51 +0000', 'ddd, DD MMM YYYY HH:mm:ss ZZ');

  • Konvertieren Sie Ihre Zeichenfolge in ein JavaScript-Datumsobjekt und übergeben Sie diese an Moment:

    moment(new Date('Wed, 23 Apr 2014 09:54:51 +0000'));

Die letzte Option ist ein integrierter Fallback, den Moment derzeit mit der veralteten Konsolenwarnung unterstützt. Sie sagen, dass sie diesen Fallback in zukünftigen Versionen nicht unterstützen werden. Sie erklären, dass die Verwendung new Date('my date')zu unvorhersehbar ist.

Joe Wilson
quelle
36
Jeder Text in den Aufzählungszeichen in der obigen Antwort würde eine viel bessere Warnung vor Abwertung darstellen als der verwirrende, der diese Frage ausgelöst hat.
Will
2
Ist die Verwendung in moment((new Date('Thursday, November 12, 2015 11:59 PM').toISOSring());Ordnung? Oder unterdrücke ich nur ein Problem, das in naher Zukunft lautlos zum Absturz gebracht werden kann?
Bruno Finger
Sie können diese Meldung auch erhalten, wenn der übergebene Wert führende oder nachfolgende zusätzliche Zeichen enthält, z. B. Leerzeichen. Es geht in der Regel mit einem InvalidDatum Ergebnis.
Guillaume Renoult
@ BrunoFinger das sollte funktionieren. Date () und toISOString () sind JavaScript-Dinge, keine Moment-Dinge.
Joe Wilson
Wenn Sie keine Wahl haben, wie das Datum angegeben werden soll, würde ich den zweiten Aufzählungspunkt empfehlen, in dem das Format der Datumszeichenfolge angegeben wird. Es beseitigt die meisten Unklarheiten.
Joshua Pinter
50

Alternativ können Sie das Anzeigen der Verfallswarnung durch Einstellen unterdrücken moment.suppressDeprecationWarnings = true;

Niutech
quelle
Für TypeScript müssen Sie möglicherweise Folgendes voranstellen // @ts-ignore(zumindest für einige Versionen von moment-timezone und @ types / moment-timezone).
TrueWill
7

Die Datumskonstruktion in verwendet momentintern das new Date()im Javascript. Die new Date()Konstruktion erkennt die Datumszeichenfolge in allen Browsern entweder im RFC2822- oder im ISO- Format. Wenn Sie ein momentObjekt mit einem Datum erstellen, das nicht in diesen Formaten vorliegt, wird die Verfallswarnung ausgegeben.

Obwohl die Verfallswarnungen ausgegeben werden, wird das momentObjekt für einige Formate erfolgreich in Chrome erstellt, jedoch nicht in Firefox oder Safari. Aus diesem Grund kann die Verarbeitung des Datums in Chrome zu erwarteten Ergebnissen führen (nicht immer) und Invalid Dateandere einwerfen .

Betrachten wir 02.02.2018,

Chrome - moment("02.02.2018")._d->Fri Feb 02 2018 00:00:00 GMT+0530 (India Standard Time)

Firefox - moment("02.02.2018")._d->Invalid Date

Safari - moment("02.02.2018")._d->Invalid Date

Die Verwendung moment.jserfolgt daher auf eigenes Risiko, falls die empfohlenen / Standardformate nicht verwendet werden.

Um die Verfallswarnungen zu unterdrücken ,

  1. Geben Sie, wie von @Joe Wilson in der vorherigen Antwort vorgeschlagen, das Datumsformat für die momentErstellung an.

Beispiel: moment("02.05.2018", "DD.MM.YYYY").format("DD MM YYYY");

  1. Geben Sie das Datum im ISO- oder RFC2822-Format an.

Beispiel: moment("2018-02-01T18:30:00.000Z")- ISO-Format

moment("Thu, 01 Feb 2018 18:30:00 GMT")- RFC2822-Format - Format in Github

  1. Wie von @niutech in der vorherigen Antwort vorgeschlagen, setzen Sie

moment.suppressDeprecationWarnings = true;

  1. Ich schlage vor, den Eingabe-Fallback im Moment zu überschreiben.

    moment.createFromInputFallback=function (config){
        config._d = new Date(config._i);
    }

Da (3) alle Warnungen unterdrückt, unterdrückt (4) nur den Fallback der Datumskonstruktion. Mit (4) erhalten Sie Invalid Dateals internenew Date() verwendet wird und andere Abwertungen in der Konsole angezeigt werden, sodass der Moment aktualisiert oder die veralteten Methoden in der Anwendung ersetzt werden können.

Vignesh Raja
quelle
3

Wenn Ihr Datum von einer API als an Sie übergeben wird string(wie in meinem Problem), können Sie einen Filter verwenden, um die Zeichenfolge für einen Moment in ein Datum zu konvertieren. Dies wird den Moment der Konstruktionswarnung berücksichtigen.

$scope.apiDate = 10/29/2017 18:28:03";

angular.module('myApp').filter('stringToDate', function() {
  return function(value) {
     return Date.parse(value);
  };  
});

Fügen Sie es der Ansicht hinzu:

{{apiDate | stringToDate | amDateFormat:'ddd, MMM DD'}}
Fergus
quelle
0

Wie in den obigen Antworten angegeben. Die Angabe des Datumsformats sollte funktionieren.

Warum sollte ich die Verfallsmeldung mit der folgenden Codezeile erhalten? Ich dachte, das String + -Format sollte das Problem beheben. moment.tz('2015:08:20 14:33:20', 'YYYY:MM:DD HH:mm:ss', 'America/New_York'). Bitte haben Sie auch keine Kontrolle über das bereitgestellte Datumsformat. Ich weiß, dass ich es selbst konvertieren kann, bis der 'YYYY-MM-DDTHH:mm:ss'Moment die Verfallsmeldung nicht anzeigt. Der Dokumentation zufolge sollte die Codezeile jedoch funktionieren. Hier ist die Abwertungsnachricht, die ich sehe.

"Verfallswarnung: Der angegebene Wert liegt nicht in einem anerkannten RFC2822- oder ISO-Format vor. Die Momentkonstruktion fällt auf js Date () zurück, was nicht für alle Browser und Versionen zuverlässig ist. Nicht-RFC2822 / ISO-Datumsformate werden nicht empfohlen und in einem entfernt bevorstehende Hauptversion. Weitere Informationen finden Sie unter http://momentjs.com/guides/#/warnings/js-date/ . "

user2027058
quelle