web-dev-qa-db-fra.com

Chrome option timeZone à Date.toLocaleString ()

J'ai récemment découvert qu'il existe une nouvelle extension de JavaScript. Cela ajoute plusieurs fonctionnalités à l'objet Date dans les fonctions toLocaleString, toLocaleDateString et toLocaleTimeString. Référence ici .

Je suis particulièrement intéressé par l'option timeZone, qui prend en charge fuseaux horaires IANA/Olson , comme America/New_York ou Europe/London. Ceci n'est actuellement pris en charge que dans Google Chrome .

Le conseil précédent était que pour travailler en JavaScript avec un autre fuseau horaire que UTC ou votre propre fuseau horaire local, il fallait tiliser une bibliothèque . Mais maintenant, il semble que cela commence à être intégré directement dans le navigateur. Alors maintenant, vous pouvez le faire:

new Date().toLocaleString("en-US", {timeZone: "America/New_York"})

// output: "7/4/2013 5:15:45 PM"

Ou:

new Date().toLocaleString("en-NZ", {timeZone: "Pacific/Chatham",
                                    timeZoneName: "long"})

// output:  "7/5/2013 9:59:52 AM GMT+12:45"

Ou:

new Date().toLocaleString("en-GB", {timeZone: "Europe/London",
                                    timeZoneName: "short"})

// output:  "4/7/2013 22:18:57 United Kingdom Time"
// (strange time zone name, but ok)

C'est très cool, mais j'ai quelques questions:

  • Cela fait-il partie d'une nouvelle norme? Peut-être enterré quelque part dans ECMAScript 6? Ou est-ce simplement quelque chose de personnalisé pour Chrome?
  • Pourquoi juste Google Chrome? Est-il pris en charge ailleurs? Est-il prévu de le soutenir ailleurs?
  • J'ai vérifié node.js, qui utilise l'environnement d'exécution JavaScript de Chrome, mais cela ne fonctionne pas là-bas. Pourquoi pas?
  • Les données de fuseau horaire sont-elles accessibles d'une autre manière que les fonctions que j'ai répertoriées? S'il n'est disponible que lors du formatage des chaînes, il peut être difficile d'effectuer des calculs en fonction des résultats.
  • Cela se concentre sur la sortie, mais comment l'utiliser pour l'entrée? Existe-t-il un moyen de passer le fuseau horaire du constructeur à l'objet Date? J'ai essayé ce qui suit:

    // parsing it with a date and time
    new Date("2013-01-01 12:34:56 America/New_York")
    
    // passing it as a named option
    new Date(2013,0,1,12,34,56,{timeZone:"America/New_York"})
    

    Aucun n'a fonctionné. Je n'ai rien trouvé dans les spécifications, donc je ne pense pas que cela existe (encore), mais dites-moi si je me trompe.

  • Le problème décrit dans cet article , créé par une faille dans la spécification ECMAScript 5, affecte toujours la sortie, même lorsque les données correctes sont dans la TZDB. Comment se fait-il que les anciennes et les nouvelles implémentations coexistent? On pourrait penser que ce serait à l'ancienne ou à l'ancienne. Par exemple, avec le fuseau horaire de mon ordinateur défini sur l'heure de l'Est des États-Unis:

    new Date(2004,10,7,0,0).toLocaleString("en-US",{timeZone:"America/New_York"})
    

    retour "11/6/2004 11:00:00 PM". Il devrait revenir à minuit, car j'ai commencé à minuit et mon fuseau horaire local correspond au fuseau horaire de sortie. Mais il place la date d'entrée fournie au mauvais point UTC en raison du problème ES5.

  • Puis-je m'attendre à ce que l'IANA publie des mises à jour de la TZDB que Google poussera Chrome mises à jour contenant les modifications?

26
Matt Johnson-Pint

mettre à jour

Il y a un article assez complet sur l'API ici


Cela fait-il partie d'une nouvelle norme? Peut-être enterré quelque part dans ECMAScript 6? Ou est-ce simplement quelque chose de personnalisé pour Chrome?

Oui, ceux-ci font partie de la ECMAScript Internationalization API . Il est implémenté séparément d'ECMAScript, mais l'exigence d'implémentation d'ECMAScript Internationalization API est d'abord d'avoir une implémentation correcte d'ECMAScript 5.1

Pourquoi juste Google Chrome? Est-il pris en charge ailleurs? Est-il prévu de le soutenir ailleurs?

Au cours des dernières années, Google Chrome a principalement été le premier à implémenter de nouvelles fonctionnalités. Mozilla est plus conservateur, discutant toujours par exemple de l'opportunité d'implémenter l'attribut download de a elements. Il est maintenant disponible dans IE11 Beta et Opera aussi. Il sera disponible dans Firefox 25 .

J'ai vérifié node.js, qui utilise l'environnement d'exécution JavaScript de Chrome, mais cela ne fonctionne pas là-bas. Pourquoi pas?

node.js utilise simplement le même moteur, qui est n projet distinct du navigateur Google Chrome navigateur. Le moteur implémente simplement Ecmascript 5.1. Il s'agit d'une extension node.js devrait être implémenté séparément dès maintenant. Il deviendra disponible dans V8 au Q donc probablement un peu après que vous pourrez l'utiliser dans node.js.

Cela se concentre sur la sortie, mais comment l'utiliser pour l'entrée? Existe-t-il un moyen de passer le fuseau horaire du constructeur à l'objet Date? J'ai essayé ce qui suit:

Il n'y a rien sur la saisie de dates dans la spécification. Personnellement, je ne vois pas en quoi cela serait utile, vous vous trompez si vous ne transmettez pas d'horodatages UTC parce que quelque chose comme "2013-01-01 12:34:56 America/New_York" est ambigu lors des transitions de l'heure d'été à l'heure standard.

Le problème décrit dans cet article, créé par une faille dans la spécification ECMAScript 5, affecte toujours la sortie, même lorsque les données correctes sont dans la TZDB.

C'est un problème d'entrée, pas de sortie. Encore une fois, construire une date avec un fuseau horaire local que vous ne pouvez pas influencer ou détecter, c'est mal faire. Utilisez la surcharge du constructeur d'horodatage ou Date.UTC.

Puis-je m'attendre à ce que l'IANA publie des mises à jour de la TZDB que Google poussera Chrome mises à jour contenant les modifications?

Rien dans la spécification mais je pense qu'il sera raisonnable de s'attendre à ce que les règles ne soient pas trop en retard.

21
Esailija

Cela fait-il partie d'une nouvelle norme? Peut-être enterré quelque part dans ECMAScript 6? Ou est-ce simplement quelque chose de personnalisé pour Chrome?

En effet, il fait partie de la nouvelle norme ECMA-402. La norme est très difficile à lire, mais il y a cette introduction conviviale .

Pourquoi juste Google Chrome? Est-il pris en charge ailleurs? Est-il prévu de le soutenir ailleurs?

MDN a une liste de navigateurs compatibles . Selon Bug 853301 il sera disponible dans Firefox 25.

J'ai vérifié node.js, qui utilise l'environnement d'exécution JavaScript de Chrome, mais cela ne fonctionne pas là-bas. Pourquoi pas?

Les raisons possibles sont nombreuses; il n'est pas à la hauteur de la base de code actuelle, ou cela rendrait le node.js plus grand et plus lent (la précédente entrée de suivi des bogues de Mozilla indique que les données de fuseau horaire ont augmenté la taille de téléchargement de Firefox de 10% et causé les E/S pour augmenter considérablement lors du démarrage du navigateur.

Les données de fuseau horaire sont-elles accessibles d'une autre manière que les fonctions que j'ai répertoriées? Si seulement
disponible lors du formatage des chaînes, puis effectuer des calculs basés sur les résultats peut être difficile.

Semble qu'il n'est pas disponible. En outre, l'amorce de l'API Intl indique que seuls l'UTC et le fuseau horaire local doivent absolument être pris en charge.

Cela se concentre sur la sortie, mais comment l'utiliser pour l'entrée? Existe-t-il un moyen de passer le fuseau horaire du constructeur à l'objet Date? J'ai essayé ce qui suit:

L'API Intl ne parle que du formatage date/heure, des classements de chaînes et du formatage des nombres. Le formatage datetime prend en charge non seulement le calendrier grégorien mais également de nombreux autres types de calendriers, lunaires, lunisolaires, etc.

Le problème décrit dans cet article, créé par une faille dans la spécification ECMAScript 5, affecte toujours la sortie, même lorsque les données correctes sont dans la TZDB. Comment se fait-il que les anciennes et les nouvelles implémentations coexistent? On pourrait penser que ce serait à l'ancienne ou à l'ancienne. Par exemple, avec le fuseau horaire de mon ordinateur défini sur l'heure de l'Est des États-Unis:

nouvelle date (2004,10,7,0,0) .toLocaleString ("en-US", {timeZone: "America/New_York"})

renvoie "11/6/2004 11:00:00 PM". Il devrait retourner à minuit, car j'ai commencé à minuit et> mon fuseau horaire local correspond au fuseau horaire de sortie. Mais il place la date d'entrée fournie au> mauvais point UTC en raison du problème ES5.

La raison en est que ES5 exige que l'entrée de la nouvelle date soit calculée en utilisant l'heure d'été et le décalage actuels, c'est-à-dire l'Amérique/New York mais avec le fuseau horaire EDT, même si le 6 novembre n'est pas en EDT. Évidemment, comme cela est spécifié, cela ne peut pas être modifié. Cependant, comme Chrome utilise la TZDB pour effectuer la conversion de la valeur ponctuelle UTC nue en tz Amérique/New York, il considère alors l'heure comme étant en EST.

Puis-je m'attendre à ce que l'IANA publie des mises à jour de la TZDB que Google poussera Chrome mises à jour contenant les modifications?

Je le croirais

6
Antti Haapala