Come posso ottenere il nome del fuso orario in JavaScript?


116

So come ottenere la differenza di fuso orario, ma ciò di cui ho bisogno è la capacità di rilevare qualcosa come "America / New York". È anche possibile da JavaScript o è qualcosa che dovrò guestimate in base all'offset?


2
Ecco una funzione scritta da Jon Nylander, forse aiuta bitbucket.org/pellepim/jstimezonedetect
yunzen

Ecco una risposta correlata che potrebbe aiutare: stackoverflow.com/a/19421672/1447034
Douglas

Risposte:


239

L' API di internazionalizzazione supporta l'acquisizione del fuso orario dell'utente ed è supportata in tutti i browser correnti.

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

Tieni presente che su alcune versioni precedenti del browser che supportano l'API di internazionalizzazione, la timeZoneproprietà è impostata su undefinedanziché sulla stringa del fuso orario dell'utente. Per quanto posso dire, al momento della scrittura (luglio 2017) tutti i browser attuali tranne IE11 restituiranno il fuso orario dell'utente come una stringa.


6
Non avrei mai pensato che fosse così semplice
Mohammed Shareef C

5
fantastico, il primo che ho visto che non usa il momento! Grazie
r0bb077

3
Ottima soluzione. Non volevo includere l'intero plug-in del fuso orario per questo momento.
Joan Gil,

1
soluzione molto semplice e simpatica!
blackiii

2
@DanielCompton oh non sapevo di questa tabella, grazie per averla corretta di nuovo.
CommonSenseCode

9

La risposta più votata è probabilmente il modo migliore per ottenere il fuso orario, tuttavia, Intl.DateTimeFormat().resolvedOptions().timeZonerestituisce il nome del fuso orario IANA per definizione, che è in inglese.

Se vuoi il nome del fuso orario nella lingua dell'utente corrente, puoi analizzarlo dalla Daterappresentazione della stringa di in questo modo:

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());

Testato in Chrome e Firefox.

Naturalmente, questo non funzionerà come previsto in alcuni ambienti. Ad esempio, node.js restituisce un offset GMT (esGMT+07:00 ) invece di un nome. Ma penso che sia ancora leggibile come riserva.

PS non funzionerà in IE11, proprio come la Intl...soluzione.



3

Recupera il fuso orario per nome (ad esempio "America / New York")

moment.tz.guess();

9
Per favore, ricorda che è anche semplicemente possibile senza dipendenze:Intl.DateTimeFormat().resolvedOptions().timeZone
user2923322

1
Sì, anche se moment-js ipotizza TZ anche per i "browser" che non supportano questa funzionalità. :)
Ferran Maylinch

in IE11 Intl.DateTimeFormat().resolvedOptions().timeZonerestituisce undefined, ma moment.tz.guess()restituisce il valore corretto
Antoni4


0

Questo ottiene il codice del fuso orario (ad esempio GMT) nel vecchio javascript (sto usando lo script dell'app Google con il vecchio motore):

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

Lo metto qui solo nel caso qualcuno ne abbia bisogno.


1
Penso che funzioni solo per UTC/ GMT. Sembra che gli altri siano enunciati; es Pacific Daylight Time.
Ian Dunn

-1

Prova questo codice di riferimento da qui

<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>

-5

In javascript, il metodo Date.getTimezoneOffset () restituisce l'offset del fuso orario rispetto a UTC, in minuti, per la locale corrente.

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

Moment'timezone sarà uno strumento utile. http://momentjs.com/timezone/

Converti date tra fusi orari

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

4
Non hai capito il que.
srsajid

3
I tuoi esempi di codice non sono correlati alla domanda originale. Come useresti questa libreria per restituire il nome del fuso orario corrente dell'utente?
Joe White
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.