Ähnliches Datumsformat erzeugt unerwartetes Javascript

8

Warum funktioniert die erste Eingabe richtig, aber die zweite Eingabe gibt mir ein Ergebnis vor 5 Stunden?

%Vor%

Wie kann ich die zweite mit mir zusammenarbeiten lassen?

%Vor%
    
Logan Murphy 20.04.2017, 14:30
quelle

2 Antworten

2

Der Grund, warum Sie dies sehen, wird auf der Seite Date.parse() von MDN (wo viele Details zu den offiziell unterstützten Date Parameterformaten beschrieben werden). Speziell:

  

Unterschiede in der angenommenen Zeitzone

     

Bei einer Datumszeichenkette vom "7. März 2014" wird von parse () eine lokale Zeitzone angenommen, bei einem ISO-Format wie "2014-03-07" wird jedoch eine Zeitzone von UTC (ES5 und ECMAScript) angenommen 2015). Daher können Date-Objekte, die mit diesen Strings erstellt werden, je nach Version von ECMAScript unterschiedliche Zeitpunkte darstellen, sofern das System nicht mit einer lokalen Zeitzone von UTC konfiguriert ist. Dies bedeutet, dass zwei Datumszeichenfolgen, die äquivalent erscheinen, je nach dem Format der Zeichenfolge, die konvertiert wird, zu zwei unterschiedlichen Werten führen.

Was Sie also sehen, ist eine Kombination von zwei Dingen:

  1. Der Konstruktor liest Ihren korrekt formatierten ISO-Datumswert als UTC, da keine Zeitzone bereitgestellt wird, und
  2. Sie erkennen genau, dass die Zeitzone Ihres lokalen Computers US-Ost ist, und passen Sie den Wert entsprechend an.

Als Ergebnis sehen Sie die US-Eastern-Time-Zone-Version von Mitternacht am 1. Januar 2000, UTC-Zeit (oder am 31. Dezember 1999, 19:00 Uhr).

Da Ihr erstes Beispiel ein Nicht-Standard-Format verwendet (aus Sicht von JS), wird die erste Annahme nicht berücksichtigt und der Wert wird unter der Annahme der lokalen Zeitzone für den Wert (ein Browser-spezifisch) erstellt Entscheidung darüber, wie mit einem Nicht-Standardformat umgegangen wird.)

    
talemyn 20.04.2017, 14:50
quelle
0

Die goldene Regel ist niemals Zeichenfolgen mit dem Date-Konstruktor oder Date.parse zu analysieren, da sie weitgehend von der Implementierung abhängig sind. Es gibt viele Macken.

Nach ECMA-262 , sollte die Zeichenfolge "2000-01-01" als gültiges ISO 8601-Datumsformat geparst werden, aber für Zeitzone UTC + 0000 . Alte Browser wie IE 8 können es überhaupt nicht analysieren, und einige können es als lokal behandeln.

Die Zeichenfolge "2000-1-1" entspricht nicht genau dem ISO 8601-Format, daher können Browser auf beliebige Heuristiken zurückgreifen, darunter:

  1. gibt ein ungültiges Datum zurück, da es kein gültiges ISO 8601-Datumsformat ist
  2. Analyse als lokales Datum für den 1. Januar 2000
  3. Behandlung als ISO 8601 und Analyse als UTC + 0000

In aktuellen Browsern treten mindestens 1 und 2 auf.

Sie sollten also am besten eine Bibliothek mit einem Parser verwenden und das Format der Zeichenfolge angeben oder eine einfache Funktion schreiben, wenn Sie nur ein Format haben, z. B.

%Vor%
    
RobG 21.04.2017 01:39
quelle

Tags und Links