Notes
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Avertissement
L’application de bureau Internet Explorer 11, mise hors service et dont le support a pris fin, a été désactivée définitivement via une mise à jour Microsoft Edge sur certaines versions de Windows 10. Pour plus d’informations, consultez le forum aux questions sur la mise hors service de l’application de bureau Internet Explorer 11.
Cet article décrit le rapport d’erreur lors de la conversion de l’heure standard en heure d’été (DST) et fournit une solution.
Version du produit d’origine : Internet Explorer 11, Internet Explorer 10, Internet Explorer 9
Numéro de base de connaissances d’origine : 2410734
Symptômes
Lorsque vous utilisez l’objet JavaScript Date
pour calculer des dates dans certaines circonstances, les utilisateurs peuvent voir des résultats apparemment incorrects. Ce comportement se produit lorsque les conditions suivantes sont remplies :
- Le fuseau horaire configuré dans les paramètres de date et d’heure passe de l’heure standard à la DST à minuit.
- L’arithmétique de date utilise des
Date
objets sans heures et minutes (ou heures et minutes à l’aide de 0), et utilise uniquement des dates qui passent de l’heure standard à la DST.
Par exemple, la tentative de construction d’une date de 10/17/2010 génère une date de 10/16 :
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
La cause
Il s’agit d’une instance spécifique d’un problème qui se produit lorsqu’un Date()
objet est initialisé exactement au moment où la DST commence.
Les valeurs utilisées pour construire l’objet Date
représentent une heure après le point où l’heure standard se termine, mais plus tôt que ce qu’une horloge locale indiquerait après le début de l'heure d'été. La spécification du langage ECMAScript (European Computer Manufacturers Association Script) spécifie qu’un ajustement DST de 1 heure est soustrait lors du calcul de la valeur de temps, la représentation interne de l’objet Date
. Toutefois, cela se termine par représenter une heure avant que la DST ne commence. Dans le cas du Brésil, cela se produit à minuit, et par conséquent, l’objet Date
finit par représenter une heure du jour précédent.
Résolution
Ce comportement est conforme à la norme ECMAScript, et il est donc par conception.
Lorsque vous ne vous souciez que du jour, du mois et de l'année, vous pouvez contourner ce comportement en construisant des objets de date avec une valeur d'heures qui n'est pas zéro, c'est-à-dire une valeur suffisamment supérieure à l'ajustement de l'heure d'été.
Plus d’informations
La norme ECMAScript est disponible dans la spécification du langage ECMAScript® 2016.
La section 20.3.2 définit la façon dont le constructeur de date est interprété, y compris le fait d’une conversion d’une valeur de temps en temps universel coordonné (UTC).
La section 20.3.1.10 définit les conversions entre l’heure locale et l’heure UTC, et indique que ces conversions ne sont pas nécessairement inverses les unes des autres.
La formule de cette conversion est la suivante :
UTC( t ) = t - LocalTZA - DaylightSavingTA(t - LocalTZA)
Si vous suivez cette procédure pour le début de la DST, vous pouvez voir comment l’heure est soustractée. Cet exemple est destiné à l’heure pacifique, de sorte que la date réelle n’est pas modifiée. Commencez par :
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>