Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
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 beim Konvertieren von Standardzeit in Sommerzeit (DST) 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 zum Berechnen von JavaScript Date
Datumsangaben unter bestimmten Umständen verwenden, werden benutzern möglicherweise Ergebnisse angezeigt, die scheinbar 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 von Standardzeit zu DST um Mitternacht.
- Datumsarithmetik verwendet
Date
Objekte ohne Stunden und Minuten (oder Stunden und Minuten mit 0) und verwendet nur Datumsangaben, die von Standardzeit zu DST wechseln.
Wenn Sie beispielsweise versuchen, ein Datum vom 17.10.2010 zu erstellen, ergibt sich aufgrund von Zeitzonenunterschieden 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 DST beginnt.
Die Werte, die zum Erstellen des Date
Objekts verwendet werden, stellen eine Zeit nach dem Punkt dar, an dem die Standardzeit endet, jedoch früher als es eine lokale Uhr anzeigen würde, nachdem die Sommerzeit begonnen hat. Die EcMAScript-Sprachspezifikation (European Computer Manufacturers Association Script) gibt an, dass beim Berechnen des Zeitwerts, der internen Darstellung des Date
Objekts, eine DST-Anpassung von 1 Stunde subtrahiert wird. Dies steht jedoch für eine Zeit, bevor DST beginnen würde. Im Fall von Brasilien tritt dies um Mitternacht auf, und daher steht das Date
Objekt für eine Zeit vom vorherigen Tag.
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, ein Stundenwert, der sicher größer als die Anpassung der Sommerzeit ist.
Weitere Informationen
Der 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 des DST befolgen, können Sie sehen, wie die Stunde subtrahiert wird. Dieses Beispiel ist für die Pazifische Zeit vorgesehen, 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>