Fehler im Datumswert zu Beginn der Sommerzeit in bestimmten Zeitzonen
Warnung
Die eingestellte, nicht unterstützte Internet Explorer 11-Desktopanwendung wurde über ein Microsoft Edge-Update für bestimmte Versionen von Windows 10 dauerhaft deaktiviert. Weitere Informationen finden Sie unter Häufig gestellte Fragen zur Einstellung von Internet Explorer 11-Desktop-Apps.
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
Problembeschreibung
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 Instanz eines Problems, das auftritt, wenn ein Date()
Objekt genau zu dem 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 durchlaufen, 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>