web-dev-qa-db-fra.com

Comment puis-je obtenir le nom du fuseau horaire en JavaScript?

Je sais comment obtenir le décalage horaire, mais ce dont j'ai besoin, c'est de pouvoir détecter quelque chose comme "Amérique/New York". Est-ce même possible à partir de JavaScript ou est-ce quelque chose que je vais devoir inviter à évaluer sur la base du décalage?

66
Mike Thomsen

API d'internationalisation prend en charge l'obtention du fuseau horaire de l'utilisateur et est pris en charge dans tous les navigateurs actuels.

console.log(Intl.DateTimeFormat().resolvedOptions().timeZone)

N'oubliez pas que sur certaines anciennes versions de navigateur prenant en charge l'API d'internationalisation, la propriété timeZone est définie sur undefined plutôt que sur la chaîne de fuseau horaire de l'utilisateur. Autant que je sache, au moment de la rédaction de cet article (juillet 2017) tous les navigateurs actuels, à l'exception de IE11 , renvoie le fuseau horaire de l'utilisateur sous forme de chaîne.

127
Daniel Compton

Vous pouvez utiliser ce script. http://pellepim.bitbucket.org/jstz/

Répertoire Fork ou clone ici. https://bitbucket.org/pellepim/jstimezonedetect

Une fois que vous avez inclus le script, vous pouvez obtenir la liste des fuseaux horaires dans - jstz.olson.timezones variable.

Et le code suivant est utilisé pour déterminer le fuseau horaire du navigateur client.

var tz = jstz.determine();
tz.name();

Profitez de jstz!

6
sean

Vous pouvez simplement écrire votre propre code en utilisant la table de correspondance ici: http://www.timeanddate.com/time/zones/

ou utilisez la bibliothèque moment-timezone: http://momentjs.com/timezone/docs/

Voir zone.name; // America/Los_Angeles

ou cette bibliothèque: https://github.com/Canop/tzdetect.js

2
advncd

La plupart des votants réponse est probablement le meilleur moyen d'obtenir le fuseau horaire. Cependant, Intl.DateTimeFormat().resolvedOptions().timeZone renvoie le nom du fuseau horaire IANA par définition, qui est en anglais.

Si vous voulez que le nom du fuseau horaire soit dans la langue de l'utilisateur actuel, vous pouvez l'analyser à partir de la représentation sous forme de chaîne de Date comme suit:

function getTimezoneName() {
  const today = new Date();
  const short = today.toLocaleDateString(undefined);
  const full = today.toLocaleDateString(undefined, { timeZoneName: 'long' });

  // Trying to remove date from the string in a locale-agnostic way
  const shortIndex = full.indexOf(short);
  if (shortIndex >= 0) {
    const trimmed = full.substring(0, shortIndex) + full.substring(shortIndex + short.length);
    
    // by this time `trimmed` should be the timezone's name with some punctuation -
    // trim it from both sides
    return trimmed.replace(/^[\s,.\-:;]+|[\s,.\-:;]+$/g, '');

  } else {
    // in some magic case when short representation of date is not present in the long one, just return the long one as a fallback, since it should contain the timezone's name
    return full;
  }
}

console.log(getTimezoneName());

Testé dans Chrome et Firefox.

Bien entendu, cela ne fonctionnera pas comme prévu dans certains environnements. Par exemple, node.js renvoie un décalage GMT (par exemple, GMT+07:00) au lieu d'un nom. Mais je pense que c'est toujours lisible comme une solution de secours.

P.S. Ne fonctionnera pas dans IE11, comme le Intl... Solution.

1
mrnateriver

Essayez ce code référez-vous à partir de ici

<script type="text/javascript" src="//ajax.googleapis.com/ajax/libs/jquery/2.0.0/jquery.min.js">
</script>
<script type="text/javascript" src="//cdnjs.cloudflare.com/ajax/libs/jstimezonedetect/1.0.4/jstz.min.js">
</script>
<script type="text/javascript">
  $(document).ready(function(){
    var tz = jstz.determine(); // Determines the time zone of the browser client
    var timezone = tz.name(); //'Asia/Kolhata' for Indian Time.

    alert(timezone);
});
</script>
1
Kumar Shanmugam