Fehler im Date-Wert am Anfang des DST in bestimmten Zeitzonen
Wichtig
Die Internet Explorer 11-Desktopanwendung wird für bestimmte Versionen von Windows 10 eingestellt und ab dem 15. Juni 2022 nicht mehr unterstützt.
Sie können mit dem Internet Explorer-Modus in Microsoft Edge weiterhin auf ältere Websites zugreifen, für die Internet Explorer erforderlich ist. Anleitung.
Die Internet Explorer 11-Desktopanwendung wird schrittweise an den schnelleren, sichereren Microsoft Edge-Browser umgeleitet und letztendlich über Windows Update deaktiviert werden. Deaktivieren von IE heute.
In diesem Artikel wird der Fehlerbericht beim Konvertieren von Standardzeit in Sommerzeit (Daylight Saving Time, DST) beschrieben und eine Lösung bereitgestellt.
Ursprüngliche Produktversion: Internet Explorer 11, Internet Explorer 10, Internet Explorer 9
Ursprüngliche KB-Nummer: 2410734
Problembeschreibung
Wenn Sie das JavaScript Date Objekt verwenden, um Datumsangaben unter bestimmten Umständen zu berechnen, werden Benutzern möglicherweise Ergebnisse angezeigt, die scheinbar falsch sind. Dieses Verhalten tritt auf, wenn die folgenden Bedingungen erfüllt sind:
- Die in Datum und Uhrzeit konfigurierte Zeitzone Einstellungen wechselt um Mitternacht von Standardzeit zu DST.
- Datumsarithmetik verwendet
DateObjekte ohne Stunden und Minuten (oder Stunden und Minuten mithilfe von 0) und verwendet nur Datumsangaben, die von Standardzeit zu DST wechseln.
Wenn Sie beispielsweise versuchen, ein Datum vom 17.10.2010 zu erstellen, wird ein Datum vom 16.10.2016 erzielt:
var dt = new Date(2010, 9,17);
// ...
console.log(dt.toString()); // evaluates to 'Sat Oct 16 23:00:00 UTC-0300 2010'
dt.getDate(); // evaluates to 16
Ursache
Dies ist eine bestimmte Instanz eines Problems, das auftritt, wenn ein Date() Objekt genau zu dem Zeitpunkt initialisiert wird, zu dem DST beginnt.
Die werte, die zum Erstellen des Objekts verwendet werden, Date stellen eine Zeit nach dem Ende der Standardzeit dar, aber früher als eine lokale Uhr würde angezeigt, nachdem DST begonnen hat. Die Spezifikation der EcmaScript-Sprache (European Computer Manufacturers Association Script) gibt an, dass eine DST-Anpassung von 1 Stunde bei der Berechnung des Zeitwerts, der internen Darstellung des Objekts, subtrahiert Date wird. Dies stellt jedoch eine Zeit dar, bevor DST beginnen würde. Im Fall von Brasilien geschieht dies um Mitternacht, und daher stellt das Date Objekt eine Zeit vom Vortag dar.
Lösung
Dieses Verhalten entspricht dem ECMAScript-Standard und ist daher entwurfsbedingt.
Wenn Sie sich nur mit Tag, Monat und Jahr befassen, können Sie dieses Verhalten umgehen, indem Sie Datumsobjekte erstellen, indem Sie einen Stundenwert verwenden, der nicht Null ist, d. h. einen Stundenwert, der sicher größer als die Anpassung der Sommerzeit ist.
Weitere Informationen
Den ECMAScript-Standard finden Sie unter ECMAScript ® 2016 Language Specification.
In Abschnitt 20.3.2 wird definiert, wie der Date-Konstruktor interpretiert wird, einschließlich der Tatsache, dass ein Zeitwert in utc (Coordinated Universal Time) konvertiert wird.
Abschnitt 20.3.1.10 definiert die Konvertierungen zwischen Ortszeit und UTC-Zeit und gibt an, dass diese Konvertierungen nicht notwendigerweise umgekehrt sind.
Die Formel für diese Konvertierung lautet wie folgt:
UTC( t ) = t - LocalTZA - DaylightSavingTA(t - LocalTZA)
Wenn Sie dies zu Beginn des DST durchgehen, können Sie sehen, wie die Stunde subtrahiert wird. This example is for pacific time, so the actual date isn't changed. Beginnen Sie mit:
t = <Sun Mar 13 02:00:00 Pacific 2011>
LocalTZA = -8
The expression t - LocalTZA occurs twice in this equation; it evaluates to <Sun Mar 13 10:00:00 UTC 2011>. This is the exact moment when DST starts in the Pacific time zone. This is the key fact during conversion of this time to UTC:
UTC( <Sun Mar 13 02:00:00 Pacific 2011> )
= <Sun Mar 13 02:00:00 Pacific 2011> - LocalTZA - DaylightSavingTA( <Sun Mar 13 02:00:00 Pacific 2011> - LocalTZA )
= <Sun Mar 13 10:00:00 UTC 2011> -DaylightSavingTA( <Sun Mar 13 10:00:00 UTC 2011> )
= <Sun Mar 13 10:00:00 UTC 2011>- 1
= <Sun Mar 13 9:00:00 UTC 2011>