Problembehandlung bei RTZ2 nach Microsoft Update KB2998527

Nach der Veröffentlichung des oben genannten Updates sind viele Entwickler auf Probleme gestoßen. Im Moment haben sie versucht, das Problem in Chrome zu beheben, aber in IE10 (Document Mode = "Standarts") funktioniert alles einwandfrei, aber in älteren Browsern und IE-Kompatibilitätsmodi funktionieren alle mit Datumsangaben nicht mehr.

Aus technischen Gründen muss ich die Arbeit der Anwendungen unterstützen, die ich in IE8-9-10 und Chrome entwickle. Außerdem benutze ich die momentjs- Bibliothek, um mit Datumsangaben zu arbeiten .

Seit dem Erscheinungsdatum war um die EckeAls ich dann in den offenen Bereichen des World Wide Web nach einer Lösung für das Problem suchte und es nicht fand, entschied ich, dass früher oder später Browser-Entwickler dieses Problem lösen würden und ich nichts ändern müssten. Aber die Veröffentlichung rückt näher und es gab auch keine Lösung.

Und jetzt ist es Zeit, dieses Problem selbst zu lösen.

Beschreiben Sie kurz die Hauptprobleme in Form einer Tabelle (unerwartete Ergebnisse sind durchgestrichen ):

IE10 (IE8 Standard)IE9 (alle Dokumentmodi)IE10 (IE10-Standard)Chrome 38.0.2125.122 m
neues Datum (2014, 0, 1)Di 31.12. 23:00:00 UTC + 0300 2013Mi Jan 1 00:00:00 UTC + 0300 2014Mi Jan 1 00:00:00 UTC + 0400 2014Mi Jan 01 2014 01:00:00 GMT + 0400
neues Datum (2015, 0, 7)Di, 6. Januar 23:00:00 UTC + 0300 2015Di, 6. Januar 23:00:00 UTC + 0300 2015Mi 7 Jan 00:00:00 UTC + 0300 2015Mi., 07. Januar 2015, 01:00:00 GMT + 0400
moment (). startOf ('year')Di 31.12. 23:00:00 UTC + 0300 2013Mi Jan 1 00:00:00 UTC + 0300 2014Mi Jan 1 00:00:00 UTC + 0400 2014Mi Jan 01 2014 01:00:00 GMT + 0400
moment (). endOf ('year')Mi 31.12. 22:59:59 UTC + 0300 2014Mi 31.12. 23:59:59 UTC + 0300 2014Mi 31.12. 23:59:59 UTC + 0300 2014Do 01 Jan 2015 00:59:59 GMT + 0300

Das erste, was mir in den Sinn kam, war, die Bibliothek für die Arbeit mit Datumsangaben (Momenten) zu modifizieren, um die Zeitpunkte korrekt zu berechnen, und sie überall anstelle des ursprünglichen Date-Objekts zu verwenden oder eine alternative Bibliothek zu finden. Sah datejs, xdate, tzdata-javascript an. Es schien jedoch zu zeitaufwändig, eine Menge Code für eine „vorübergehende“ Lösung von Problemen neu zu schreiben. Trotzdem bleibt die Hoffnung, dass die Probleme mit der Zeitzone mit den folgenden Browser-Patches verschwinden.

Und dann kam ein heller Gedanke - das Date-Objekt zu ändern. Lassen Sie es problematische Daten behandeln und bringen Sie sie zu einer einzigen Ansicht, unabhängig vom Browser. Das heißt new Date (2014, 0, 1) sollte immer ein Datum 01.01.2014 00:00 UTC + 0400 erzeugen, dann berechnet momentjs.endOf ('year') das Jahresende korrekt.

Wie kann man das erreichen?

Das Prinzip ist das Folgende: Die Zeit in UTC + 0000 ist kontinuierlich und Fehler bei der Implementierung der Zeitzone wirken sich nicht auf diese aus. Daher können alle Manipulationen mit dem Datum in UTC ausgeführt werden. Im Allgemeinen sollten Sie die Arbeit mit der Zeitzone im Browser ignorieren, da diese nicht ordnungsgemäß funktioniert. Diese Verfeinerung sollte jedoch für den Benutzer (Webentwickler) transparent sein, d. H. Das Datum sollte immer noch in seiner lokalen Zeitzone angezeigt werden.

Nachdem ich die Spezifikation des Date-Objekts untersucht hatte , entwickelte ich die folgende Methode:

1. Es ist erforderlich, den Date-Konstruktor neu zu definieren, damit die Zeit in UTC erstellt wird.
Rufen Sie das ursprüngliche Date-Objekt NativeDate und das neue (feste) NewDate-Objekt auf.
Dann führt NewDate (Jahr, Monat, Datum) den NativeDate-Code (NativeDate.UTC (Jahr, Monat, Datum)) aus.
2. Die Methoden setTime, getTime und valueOf arbeiten mit offset, dh wenn dies schematisch beschrieben ist, führt NewDate.setTime (offset) NativeDate.setTime (offset + _nullOffset) und NewDate.getTime () und NewDate.valueOf () aus. NativeDate.getTime () -_ nullOffset zurückgeben. Dabei ist _nullOffset = -new NativeDate (0) .getTimezoneOffset () * 60000. Dieser Ansatz gewährleistet transparentes Arbeiten mit Nullpunktverschiebung (neues Datum (0)).
3. Setter und Getters für die Eigenschaften Date, Day, FullYear, Hours, Milliseconds, Minutes, Month, Seconds des NewDate-Objekts. Wir verweisen auf Setter und Getters mit ähnlichen Eigenschaften mit dem UTC-Präfix des NativeDate-Objekts. Und Setter und Getter mit dem UTC-Präfix für NewDate berücksichtigen die Zeitzone.
Nachdem Sie diese Schritte ausgeführt haben, hat alles einwandfrei funktioniert.

Um die Funktionalität des ursprünglichen Date-Objekts vollständig zu unterstützen, mussten jedoch alle Optionen zum Aufrufen des Date-Konstruktors sowie die Methoden Date.parse, Date.UTC, Date.now und alle möglichen Methoden zum Serialisieren des Objekts in eine Zeichenfolge unterstützt werden.

Es stellte sich so etwas heraus: rtz2fix .

Ich würde mich sehr freuen, wenn jemand Probleme in dieser Lösung findet und mir diese meldet.

Verwandte Links


"Chrome, der Weihnachten gestohlen hat" ;
"Neue Zeitzone - neue Probleme . "

Jetzt auch beliebt: