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?
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.
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
:
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.
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 Hammonds Antwort ist großartig, aber spielt nicht alle Tricks; also hier ist eine modifizierte Version:
Tags und Links javascript datetime asp.net utc