Fehler im Datumswert zu Beginn der Sommerzeit in bestimmten Zeitzonen

Warnung

Die eingestellte, nicht mehr unterstützte Desktop-Anwendung Internet Explorer 11 wurde durch ein Microsoft Edge-Update in bestimmten Versionen von Windows 10 dauerhaft deaktiviert. Weitere Informationen finden Sie unter Häufig gestellte Fragen zur Einstellung der Desktop-App von Internet Explorer 11.

In diesem Artikel wird der Fehlerbericht bei der Konvertierung von der Standardzeit in die Sommerzeit (Sommerzeit) beschrieben und eine Lösung bereitgestellt.

Ursprüngliche Produktversion: Internet Explorer 11, Internet Explorer 10, Internet Explorer 9
Ursprüngliche KB-Nummer: 2410734

Symptome

Wenn Sie das -Objekt unter bestimmten Umständen zum Berechnen von JavaScript Date Datumsangaben verwenden, werden Benutzern möglicherweise Ergebnisse angezeigt, die offensichtlich falsch sind. Dieses Verhalten tritt auf, wenn die folgenden Bedingungen erfüllt sind:

  • Die in den Einstellungen für Datum und Uhrzeit konfigurierte Zeitzone wechselt um Mitternacht von der Standardzeit in die Sommerzeit.
  • Die Datumsarithmetik verwendet Date Objekte ohne Stunden und Minuten (oder Stunden und Minuten mit 0) und verwendet nur Datumsangaben, die von der Standardzeit zur Sommerzeit übergehen.

Wenn Sie beispielsweise versuchen, ein Datum vom 17.10.2010 zu erstellen, ergibt sich ein Datum vom 16.10.:

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 instance eines Problems, das auftritt, wenn ein Date() Objekt genau auf den Zeitpunkt initialisiert wird, zu dem die Sommerzeit beginnt.

Die Werte, die zum Erstellen des Date Objekts verwendet werden, stellen eine Zeit nach dem Zeitpunkt dar, an dem die Standardzeit endet, aber früher als eine lokale Uhr angezeigt wird, nachdem die Sommerzeit begonnen hat. Die ECMAScript-Sprachspezifikation (European Computer Manufacturers Association Script) gibt an, dass bei der Berechnung des Zeitwerts, der internen Darstellung des Objekts, eine DST-Anpassung von Date 1 Stunde subtrahiert wird. Dies stellt jedoch eine Zeit vor beginn der Sommerzeit dar. Im Fall von Brasilien tritt dies um Mitternacht auf, sodass das Date Objekt schließlich eine Zeit vom vorigen Tag darstellt.

Lösung

Dieses Verhalten entspricht dem ECMAScript-Standard und ist daher beabsichtigt.

Wenn Sie sich nur mit dem Tag, dem Monat und dem Jahr befassen, können Sie dieses Verhalten umgehen, indem Sie Datumsobjekte mithilfe eines Stundenwerts erstellen, der nicht null ist, d. h. ein Stundenwert, der sicher größer ist als die Sommerzeitanpassung.

Weitere Informationen

Den ECMAScript-Standard finden Sie unter ECMAScript® 2016 Language Specification.

Abschnitt 20.3.2 definiert, wie der Date-Konstruktor interpretiert wird, einschließlich der Tatsache einer Konvertierung eines Zeitwerts in koordinierte Weltzeit (UTC).

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 für den Beginn der Sommerzeit durchgehen, können Sie sehen, wie die Stunde subtrahiert wird. Dieses Beispiel gilt für pacific time, sodass das tatsächliche Datum nicht geändert wird. 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>