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

118

Je sais comment obtenir le décalage du fuseau horaire, mais ce dont j'ai besoin est la capacité de 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 évaluer en fonction du décalage?

Mike Thomsen
la source
2
Voici une fonction que Jon Nylander a écrite, peut-être que cela aide bitbucket.org/pellepim/jstimezonedetect
yunzen
Voici une réponse connexe qui pourrait aider: stackoverflow.com/a/19421672/1447034
Douglas

Réponses:

242

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

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

Gardez à l'esprit que sur certaines anciennes versions de navigateur prenant en charge l'API d'internationalisation, la timeZonepropriété est définie sur undefinedplutôt que sur la chaîne de fuseau horaire de l'utilisateur. Pour autant que je sache, au moment de la rédaction (juillet 2017), tous les navigateurs actuels, à l'exception d'IE11 , renverront le fuseau horaire de l'utilisateur sous forme de chaîne.

Daniel Compton
la source
6
Jamais pensé que c'était aussi simple
Mohammed Shareef C
5
génial, le premier que j'ai vu qui n'utilise pas le moment! Merci
r0bb077
3
Solution géniale. Je ne voulais pas inclure le plugin de fuseau horaire du moment pour cela.
Joan Gil
1
solution très simple et agréable!
blackiii
2
@DanielCompton oh je ne connaissais pas ce tableau, merci de l'avoir corrigé à nouveau.
CommonSenseCode
9

La réponse la plus votée est probablement le meilleur moyen d'obtenir le fuseau horaire, cependant, Intl.DateTimeFormat().resolvedOptions().timeZonerenvoie 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 Datede la représentation sous forme de chaîne de la manière suivante:

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 solution de secours.

PS ne fonctionnera pas dans IE11, tout comme la Intl...solution.

mrnateriver
la source
3

Récupérer le fuseau horaire par nom (par exemple "Amérique / New York")

moment.tz.guess();
Omer
la source
10
Merci de mentionner que c'est aussi simplement possible sans aucune dépendance:Intl.DateTimeFormat().resolvedOptions().timeZone
user2923322
1
Oui, bien que moment-js devine également TZ pour les "navigateurs" qui ne prennent pas en charge cette fonctionnalité. :)
Ferran Maylinch
dans IE11 Intl.DateTimeFormat().resolvedOptions().timeZonedonne en retour undefined, mais moment.tz.guess()renvoie la valeur correcte
Antoni4
0

Cela obtient le code du fuseau horaire (par exemple GMT) dans l'ancien javascript (j'utilise le script de l'application Google avec l'ancien moteur):

function getTimezoneName() {
  return new Date().toString().get(/\((.+)\)/);
}

Je mets juste ça ici au cas où quelqu'un en aurait besoin.

Toddmo
la source
1
Je pense que cela ne fonctionne que pour UTC/ GMT. Il semble que les autres soient précisés; par exemple Pacific Daylight Time.
Ian Dunn le
-1

Essayez ce code référez-vous à partir d' 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>
Kumar Shanmugam
la source
-5

En javascript, la méthode Date.getTimezoneOffset () renvoie le décalage du fuseau horaire par rapport à UTC, en minutes, pour les paramètres régionaux actuels.

var x = new Date();
var currentTimeZoneOffsetInHours = x.getTimezoneOffset() / 60;

Moment'timezone sera un outil utile. http://momentjs.com/timezone/

Convertir les dates entre les fuseaux horaires

var newYork    = moment.tz("2014-06-01 12:00", "America/New_York");
var losAngeles = newYork.clone().tz("America/Los_Angeles");
var london     = newYork.clone().tz("Europe/London");

newYork.format();    // 2014-06-01T12:00:00-04:00
losAngeles.format(); // 2014-06-01T09:00:00-07:00
london.format();     // 2014-06-01T17:00:00+01:00
user3345614
la source
4
Vous n'avez pas compris la que.
srsajid
3
Vos exemples de code ne sont pas liés à la question d'origine. Comment utiliseriez-vous cette bibliothèque pour renvoyer le nom du fuseau horaire actuel de l'utilisateur?
Joe White