Moment: Parse-Wert ohne Fallback

Erstellt am 10. Juli 2015  ·  9Kommentare  ·  Quelle: moment/moment

Die Übergabe eines beliebigen Werts an moment(value) führt zu einer veralteten Warnung gemäß #1407.

Es wäre wirklich schön, wenn es eine Möglichkeit gäbe, dieses Parsing zu verwenden, ohne auf den Date-Konstruktor zurückzugreifen. Der einzige Weg, den ich bisher gefunden habe, ist ziemlich ungeschickt:

if (moment.isDate(value)) {
    return moment(value);
} else {
    return moment(value, moment.ISO_8601);
}

Und selbst dann werden ASP.net /Date(1198908717056)/ Strings immer noch nicht analysiert.

Die einfachste Option wäre, die strikte Option in Form von zwei Argumenten zuzulassen: moment(value, true) .

Vielen Dank.

Enhancement

Hilfreichster Kommentar

@SystemParadox falls es hilfreich ist, ich hatte ein ähnliches Problem wie Ihres und erstellte Wrapper-Funktionen wie diese:

function disableNativeDateFallback(config) {
    config._d = new Date(parseFloat('NaN')); // an invalid date
}
function makeMomentWrapper(momentFn) {
    return function() {
        var prevFallback = moment.createFromInputFallback;
        moment.createFromInputFallback = disableNativeDateFallback;
        var result = momentFn.apply(null, arguments);
        moment.createFromInputFallback = prevFallback;
        return result;
    }
};
var momentStrict = makeMomentWrapper(moment);
momentStrict.utc = makeMomentWrapper(moment.utc);

Sie funktionieren, indem sie createFromInputFallback kurz ersetzen und dann wiederherstellen, bevor sie zurückkehren, um zu vermeiden, dass anderen Code beeinträchtigt wird. Jeder Code, den Sie migrieren möchten, kann momentStrict und momentStrict.utc anstelle von moment und moment.utc und der Rest kann so bleiben, wie er ist.

Alle 9 Kommentare

Nur zur Verdeutlichung, Sie fragen nach einer Möglichkeit, den Fallback zu deaktivieren, anstatt die Warnung anzuzeigen - ohne den strikten Modus zu verwenden, oder?

Ja, ich möchte alle Dinge, die moment() unterstützt, automatisch analysieren, aber wenn sie alle fehlschlagen, möchte ich, anstatt eine Warnung auszugeben und den Date Konstruktor zu verwenden, ein ungültiges Datum erzeugen.

Ich möchte mich präventiv für das Verhalten einer zukünftigen Version von moment anmelden, bei der der veraltete Date Konstruktor-Fallback vollständig entfernt wird.

Ich weiß nicht genau, was du mit striktem Modus meinst. Meinen Sie, wenn Sie das genaue Format wie moment(value, 'YYYY-MM-DD') ? Wenn ja, hilft dies nicht, weil 1. es unerschwinglich ausführlich ist und 2. es immer noch nicht alle Formate enthält, die moment(value) analysieren kann, bevor es auf den Date Konstruktor zurückgreift.

Der strikte Modus wird aktiviert, indem als letzten Parameter true wird. Es steht in den Dokumenten. Grundsätzlich bedeutet dies, dass der String dem Format _exakt_ entsprechen muss.

Da die Formate, die direkt von moment(String) werden, in den Dokumenten aufgeführt sind, denke ich, dass es akzeptabel wäre, dies als strikten Modus zu betrachten. Mit anderen Worten, das Hinzufügen von moment(String, Boolean) .

Ja das wäre toll. Vielen Dank.

@SystemParadox ja, was Sie wollen, wird unterstützt. Sie überschreiben einfach moment.createFromInputFallback(config) :

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

Ich stimme zu, es ist nicht trivial, aber es ist möglich ;-)

Das ist hilfreich, ändert aber die Einstellung global.

Was ist, wenn ich eine Codebasis schrittweise migrieren möchte, einen Aufruf nach dem anderen?

Warum können wir nicht einfach Unterstützung für moment(String, true) hinzufügen?

Die Wiedereröffnung, während es die Problemumgehung gibt, würde dies in der öffentlichen API bei einer Vielzahl von Anwendungsfällen unterstützen. Betrachten Sie auch #2535, in dem nur die eingebauten Formate validiert werden sollen.

Was benötigt wird, ist die Konstante moment.JS_DATE, das heißt, übergeben Sie einfach die Eingabe an new Date , überprüfen Sie https://github.com/moment/moment/issues/1686. Akzeptieren von Pull-Requests.

@SystemParadox falls es hilfreich ist, ich hatte ein ähnliches Problem wie Ihres und erstellte Wrapper-Funktionen wie diese:

function disableNativeDateFallback(config) {
    config._d = new Date(parseFloat('NaN')); // an invalid date
}
function makeMomentWrapper(momentFn) {
    return function() {
        var prevFallback = moment.createFromInputFallback;
        moment.createFromInputFallback = disableNativeDateFallback;
        var result = momentFn.apply(null, arguments);
        moment.createFromInputFallback = prevFallback;
        return result;
    }
};
var momentStrict = makeMomentWrapper(moment);
momentStrict.utc = makeMomentWrapper(moment.utc);

Sie funktionieren, indem sie createFromInputFallback kurz ersetzen und dann wiederherstellen, bevor sie zurückkehren, um zu vermeiden, dass anderen Code beeinträchtigt wird. Jeder Code, den Sie migrieren möchten, kann momentStrict und momentStrict.utc anstelle von moment und moment.utc und der Rest kann so bleiben, wie er ist.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen