Moment: Suchen Sie nach dem Meridiem-Indikator, wenn Sie das ISO-Format anpassen

Erstellt am 23. Feb. 2016  ·  15Kommentare  ·  Quelle: moment/moment

Wie in #2983 dargestellt, entspricht die Verwendung des Datumsformats "2016-02-23 11:31:23 PM" einem ISO-Format, obwohl dies nicht der Fall ist. Dies führt dazu, dass ein falsches Datum geparst wird:

moment('2016-02-23 11:31:23 PM').format() = "2016-02-23T11:31:23-06:00"

Dies liegt daran, dass 2016-02-23 11:31:23 technisch gesehen ein ISO-Format ist.
Wir müssen die From-String-Datei ändern, um nach einem Meridiem-Indikator zu suchen und etwas anderes tun, als das ISO-Format anzupassen, wenn es vorhanden ist.

Bug Forgiving parsing

Alle 15 Kommentare

Autsch! Das sieht so aus, als ob es jemanden beißen könnte. Auch keine Verfallswarnung.

Es scheint, als ob es ausreicht, nur sicherzustellen, dass der ISO-Checker bis zum Ende des Strings reicht, zB indem ein $ am Ende von extendedIsoRegex und basicIsoRegex hinzugefügt wird.

@icambron Ich glaube nicht, dass wir das tun können. Derzeit besteht folgender Test:

    assert.ok(moment('2016-01-01 is my date').isValid(), 'test extra chars after iso date')

Es ist fast sicher, dass es jemanden auf der Welt gibt, der das tut. Ändern Sie die Regex und dieser Test schlägt fehl (zusammen mit ein paar anderen, die ich noch nicht gefunden habe).

Hm, okay. Mein Ansatz wäre, das abzulehnen und dieses AM/PM-Ding zu beheben, wenn wir den Support dafür einstellen. Ich sehe keinen guten Grund, warum wir moment('2016-01-01 is my date') support unterstützen _sollten_

Ich habe ein wenig darüber nachgedacht und frage mich, ob die am wenigsten invasive Antwort auf einige der Parser-Probleme, die wir sehen - wie dieses - darin besteht, den Parser tatsächlich auf den strikten Modus zurückzusetzen. Es scheint so, als ob nachsichtige Parsing-Probleme (wie dieses) meistens durch den Wechsel in den strikten Modus gelöst werden (da der Benutzer eigentlich den strikten Modus hätte verwenden sollen). Vielleicht ist dies eines dieser Dinge, die Menschen helfen, in die Grube des Erfolgs zu fallen? Das würde die vorhandene Funktionalität ermöglichen, aber den Entwickler auf den richtigen Weg bringen.

Stimmen Sie zu, das wollten wir schon lange machen. Ich denke, es wird seit langem als mögliches 3.0-Element aufgeführt. Aber sicherlich ist es ein kleiner Schritt, die automagische Ein-Arg-Signatur streng zu haben.

Ich habe heute tatsächlich mit der standardmäßigen Codierung des Strict-Modus begonnen, indem ich eine umschaltbare globale Zustandsvariable namens globalStrict hinzugefügt habe, die ich standardmäßig auf true gesetzt habe. Die strikte Moduseinstellung kann dann durch Aufrufen wieder auf false geschaltet werden:

moment.globalStrict(false)

Dadurch verhält sich alles wie immer, ohne dass jeder Aufruf des Moment-Parsers geändert werden muss.
Es dauert ungefähr vier Zeilen Code, um diese Änderung vorzunehmen - und dann muss man Hunderte von Unit-Tests korrigieren :-)
Für mich könnte dies jedoch eine Möglichkeit sein, strikt standardmäßig auszurollen, ohne auf v3 warten zu müssen.
Ich habe das Gefühl, dass Benutzer die Änderung problemlos akzeptieren können, ohne sich zu sehr zu beschweren.

Alternativ könnte die Einstellung globalStrict standardmäßig auf false gesetzt sein, und wir könnten Entwicklern dringend empfehlen, sie in der Dokumentation auf true zu setzen. Das ist weniger invasiv und vielleicht hilfreich?
Ich werde der Erste sein, der sagt, dass globale Zustandsvariablen vom Standpunkt der Testbarkeit aus SUCK sind, und allein aus diesem Grund könnte diese Idee schrecklich sein.

Ich könnte auch, wie vorgeschlagen, nur Aufrufe mit einem Argument auf den strikten Modus zurücksetzen. Das wird die wahrscheinlich Tausenden von Menschen verärgern, die immer noch auf die JS-Datumskonstruktion zurückgreifen.

Das gefällt mir alles, bis auf eine Sache:

Das wird die wahrscheinlich Tausenden von Menschen verärgern, die immer noch auf die JS-Datumskonstruktion zurückgreifen.

Um es klar zu sagen, mein Vorschlag war nicht, die Einstellung "Can't-Fall-back-to-JS-constructor" zu beenden. Im Gegenteil: In diesem Fall wollen wir genau das tun, aber der ISO-Check kommt uns zuvor.

Sagen Sie also, dass Sie die Sache mit dem globalen Staat versuchen würden oder dass Sie es vermeiden würden? Vielleicht beende ich einfach die Unit-Tests und mache die PR und wir können uns dort darüber unterhalten.

Entschuldigung, ich war unklar: Ich bin überhaupt nicht gegen die Sache mit dem globalen Staat. Ich glaube nur nicht, dass es uns davon abhält, die ISO-Prüfung von moment(string) die ganze Zeit streng zu machen, auch ohne den Statussatz.

@maggiepint danke für den Hinweis auf den richtigen Thread.
und Sie haben oben richtig gesagt, dass ich "einer von diesen Leuten da draußen" war: P, die Dinge tun wie
moment("2016-04-06Tnull").isValid()
mit voller Gewissheit, dass dieser Moment eine ungültige Zeichenfolge zurückweisen wird.

Was ist also der einfachste Weg, um das strikte Parsen standardmäßig zu aktivieren? (sorry, faul sein)

@Aukhan wir haben Global Strict nie implementiert, da ein Problem mit dem Strict-Mode-Parsing zuerst behoben werden musste. (aber es war, also können wir noch dorthin gelangen).

Um das zu erreichen, was Sie tun, müssen Sie meiner Meinung nach nur die ISO_8601-Konstante und den strikten Modus inline in Ihrem Code angeben:

moment("2016-04-06Tnull", moment.ISO_8601, true).isValid()
false

@maggiepint danke nochmal für deine Antwort...

Das ist ein großartiger Vorschlag, aber ich möchte nicht Hunderte solcher Ausdrücke ersetzen, bei denen nicht nur ISO_8601, sondern verschiedene benutzerdefinierte Formate verwendet werden.
Ich habe angefangen, mich mit der Codebasis zu beschäftigen, aber offensichtlich kann man solch eine riesige und großartige Arbeit nicht über Nacht verstehen.

Ich verfüge möglicherweise nicht über die erforderlichen Fähigkeiten, aber wenn ich irgendwie helfen kann, lassen Sie es mich bitte wissen.
Vielen Dank !

@Aukhan Ich werde sehen, ob ich das Arbeitselement nicht wieder abholen kann. Das Problem ist, dass PR #3078 zusammengeführt werden muss, damit es funktioniert. Deshalb wurde das Ding überhaupt fallen gelassen.

Schluss zu Gunsten von #3502

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen