Chrome interpretiert ISO-Zeit ohne Z als UTC; C # -Ausgabe

8

Führen Sie diese jsfiddle: Ссылка auf Chrome, FF und IE aus und Sie erhalten:

Chrome:

Chrome http://images.devs-on.net/Image/vBTz86J0f4o8zlL3-Region.png

Firefox:

Firefox http://images.devs-on.net/Image/aNPxNPUpltyjVpSX-Region.png

IE:

IE http://images.devs-on.net/Image/WXLM5Ev1Viq4ecFq-Region.png

Safari:

Safari http://images.devs-on.net/Image/AEcyUouX04k2yIPo-Region.png

ISO 8601 scheint nicht zu sagen, wie eine Zeichenkette ohne ein hinteres Z interpretiert werden sollte.

Unser Server (ASP.NET MVC4) zieht UTC-Zeiten aus unserer Datenbank als DateTime s und stopft sie einfach in JSON. Wie Sie sehen können, bekommen wir dadurch inkonsistente Ergebnisse im Browser.

Sollen wir ihnen einfach Z auf der Serverseite anhängen?

    
tig 17.02.2013, 17:35
quelle

4 Antworten

10
  

Chrome interpretiert ISO-Zeit ohne Z als UTC; C # -Ausgabe

Was richtig ist, sind Firefox und IE, die es falsch verstehen.

Während der Artikel, den Sie verlinkt haben, tatsächlich sagt, was es bedeutet, wenn es keine Z gibt ( "Wenn keine UTC-Beziehungsinformationen mit einer Zeitdarstellung angegeben werden, wird die Zeit als lokale Zeit angenommen." ), ist die wichtigere Sache, dass die ECMAScript5-Spezifikation ziemlich sagt klar, dass keine Zeitzoneninformationen Z bedeuten:

  

Der Wert eines fehlenden Zeitzonen-Offsets ist "Z".

Ja, ich würde wahrscheinlich sicherstellen, dass die Zeichenfolge Z enthält, da dies konsistente Ergebnisse zu liefern scheint.

    
T.J. Crowder 17.02.2013 17:42
quelle
5

Am Ende des Tages kann das Problem, mit dem ich in dieser App konfrontiert bin, behoben werden, wenn mein Server immer die DateTime-Objekte des Clients in einem Format sendet, mit dem alle Browser korrekt umgehen.

Dies bedeutet, dass das "Z" am Ende sein muss. Stellt sich heraus, dass der ASP.NET MVC4 Json Serializer auf Json.NET basiert, aber Utc nicht standardmäßig aktiviert hat. Der Standardwert für DateTimeZoneHandling scheint RoundtripKind zu sein und dies gibt die Werte mit Z nicht aus, auch wenn DateTime.Kind == Utc , was ziemlich ärgerlich ist.

Damit der Fix erscheint, legen Sie fest, wie Json.NET Zeitzonen auf DateTimeZoneHandling.Utc :

umsetzt %Vor%

Nun wird alles, was von meinem Server zum Browser kommt, als ISO-8601 mit einem "Z" am Ende formatiert. Und alle Browser, mit denen ich getestet habe, machen das Richtige.

    
tig 17.02.2013 23:09
quelle
2

Ich bin auf dieses Problem gestoßen, und die Interpretation des Datums mit der lokalen Zeitzone war viel sinnvoller als die Umstellung auf "Z", zumindest für meine Anwendung. Ich habe diese Funktion erstellt, um die lokalen Zeitzoneninformationen anzufügen, wenn sie im ISO-Datum fehlen. Dies kann anstelle des neuen Datums () verwendet werden. Teilweise abgeleitet von dieser Antwort: Wie zu ISO 8601 ein Datum mit Zeitzonen-Offset in JavaScript formatieren?

%Vor%     
David Hammond 03.10.2013 16:15
quelle
0

David Hammonds Antwort ist großartig, aber spielt nicht alle Tricks; also hier ist eine modifizierte Version:

  • ermöglicht einen Bruchteil in der Datum / Uhrzeit-Zeichenfolge
  • erlaubt optionale Sekunden in Datum / Uhrzeit-String
  • erwägt die Überschreitung der Sommerzeit
%Vor%     
klaus triendl 30.03.2017 20:56
quelle

Tags und Links