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.