Contexte
L' Date
objet JavaScript suit le temps en UTC en interne, mais accepte généralement les entrées et produit des sorties à l'heure locale de l'ordinateur sur lequel il s'exécute. Il a très peu d'installations pour travailler avec le temps dans d'autres fuseaux horaires.
La représentation interne d'un Date
objet est un nombre unique, représentant le nombre de millisecondes qui se sont écoulées depuis 1970-01-01 00:00:00 UTC
, sans tenir compte des secondes intercalaires. Aucun fuseau horaire ni format de chaîne n'est stocké dans l'objet Date lui-même. Lorsque diverses fonctions de l' Date
objet sont utilisées, le fuseau horaire local de l'ordinateur est appliqué à la représentation interne. Si la fonction produit une chaîne, les informations locales de l'ordinateur peuvent être prises en considération pour déterminer comment produire cette chaîne. Les détails varient selon la fonction et certains sont spécifiques à l'implémentation.
Les seules opérations que l' Date
objet peut effectuer avec des fuseaux horaires non locaux sont:
Il peut analyser une chaîne contenant un décalage UTC numérique à partir de n'importe quel fuseau horaire. Il l'utilise pour ajuster la valeur analysée et stocke l'équivalent UTC. L'heure locale et le décalage d'origine ne sont pas conservés dans l' Date
objet résultant . Par exemple:
var d = new Date("2020-04-13T00:00:00.000+08:00");
d.toISOString() //=> "2020-04-12T16:00:00.000Z"
d.valueOf() //=> 1586707200000 (this is what is actually stored in the object)
Dans les environnements qui ont implémenté l' API d'internationalisation ECMASCript (alias "Intl"), un Date
objet peut produire une chaîne spécifique aux paramètres régionaux ajustée à un identifiant de fuseau horaire donné. Ceci est accompli via l' timeZone
option to toLocaleString
et ses variations. La plupart des implémentations prendront en charge les identifiants de fuseau horaire IANA, tels que 'America/New_York'
. Par exemple:
var d = new Date("2020-04-13T00:00:00.000+08:00");
d.toLocaleString('en-US', { timeZone: 'America/New_York' })
//=> "4/12/2020, 12:00:00 PM"
// (midnight in China on Apring 13th is noon in New York on April 12th)
La plupart des environnements modernes prennent en charge l'ensemble complet des identificateurs de fuseau horaire IANA ( voir le tableau de compatibilité ici ). Cependant, gardez à l'esprit que le seul identifiant requis pour être pris en charge par Intl est 'UTC'
, vous devez donc vérifier attentivement si vous devez prendre en charge les navigateurs plus anciens ou les environnements atypiques (par exemple, les appareils IoT légers).
Bibliothèques
Il existe plusieurs bibliothèques qui peuvent être utilisées pour travailler avec des fuseaux horaires. Bien qu'ils ne puissent toujours pas faire en sorte que l' Date
objet se comporte différemment, ils implémentent généralement la base de données de fuseau horaire IANA standard et fournissent des fonctions pour l'utiliser en JavaScript. Les bibliothèques modernes utilisent les données de fuseau horaire fournies par l'API Intl, mais les bibliothèques plus anciennes ont généralement des frais généraux, surtout si vous utilisez un navigateur Web, car la base de données peut devenir un peu volumineuse. Certaines de ces bibliothèques vous permettent également de réduire de manière sélective l'ensemble de données, selon les fuseaux horaires pris en charge et / ou la plage de dates avec lesquelles vous pouvez travailler.
Voici les bibliothèques à considérer:
Bibliothèques basées sur Internet
Les nouveaux développements doivent choisir l'une de ces implémentations, qui s'appuient sur l'API Intl pour leurs données de fuseau horaire:
Bibliothèques non internationales
Ces bibliothèques sont maintenues, mais portent le fardeau de regrouper leurs propres données de fuseau horaire, qui peuvent être assez volumineuses.
* Alors que Moment et Moment-Timezone étaient précédemment recommandés, l'équipe Moment préfère désormais que les utilisateurs choisissent Luxon pour un nouveau développement.
Bibliothèques abandonnées
Ces bibliothèques ont été officiellement fermées et ne devraient plus être utilisées.
Propositions futures
La proposition temporelle TC39 vise à fournir un nouvel ensemble d'objets standard pour travailler avec les dates et les heures dans le langage JavaScript lui-même. Cela inclura la prise en charge d'un objet sensible au fuseau horaire.