Como posso obter o nome do fuso horário em JavaScript?


116

Sei como obter a diferença de fuso horário, mas o que preciso é a capacidade de detectar algo como "América / Nova York". Isso é possível a partir do JavaScript ou é algo que terei de estimar com base no deslocamento?


2
Aqui está uma função que Jon Nylander escreveu, talvez ajude bitbucket.org/pellepim/jstimezonedetect
yunzen

Aqui está uma resposta relacionada que pode ajudar: stackoverflow.com/a/19421672/1447034
Douglas

Possível duplicata da abreviação do fuso horário
jberryman

Respostas:


239

A API de internacionalização oferece suporte para obter o fuso horário do usuário e é compatível com todos os navegadores atuais.

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

Lembre-se de que em algumas versões mais antigas do navegador que suportam a API de internacionalização, a timeZonepropriedade é definida como undefinedem vez da string de fuso horário do usuário. Até onde posso dizer, no momento da escrita (julho de 2017), todos os navegadores atuais, exceto o IE11 , retornarão o fuso horário do usuário como uma string.


6
Nunca pensei que fosse tão simples
Mohammed Shareef C

5
incrível, o primeiro que eu vi que não usa o momento! Obrigado
r0bb077

3
Solução incrível. Não queria incluir o plugin de fuso horário de momento inteiro para isso.
Joan Gil

1
solução muito simples e agradável!
blackiii

2
@DanielCompton oh eu não sabia sobre esta tabela, obrigado por corrigi-la novamente.
CommonSenseCode

9

A resposta mais votada é provavelmente a melhor maneira de obter o fuso horário, no entanto, Intl.DateTimeFormat().resolvedOptions().timeZoneretorna o nome do fuso horário da IANA por definição, que está em inglês.

Se você quiser o nome do fuso horário no idioma do usuário atual, pode analisá-lo a partir Dateda representação de string da seguinte maneira:

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

Testado no Chrome e Firefox.

Claro, isso não funcionará como esperado em alguns dos ambientes. Por exemplo, node.js retorna um deslocamento GMT (por exemplo GMT+07:00) em vez de um nome. Mas acho que ainda pode ser lido como uma alternativa.

PS Não funciona no IE11, apenas como Intl...solução.



3

Recuperar fuso horário por nome (ou seja, "América / Nova York")

moment.tz.guess();

9
Por favor, mencione que também é simplesmente possível sem quaisquer dependências:Intl.DateTimeFormat().resolvedOptions().timeZone
user2923322

1
Sim, embora o moment-js também adivinhe TZ para "navegadores" que não suportam esse recurso. :)
Ferran Maylinch

no IE11 Intl.DateTimeFormat().resolvedOptions().timeZoneretorna undefined, mas moment.tz.guess()retorna o valor correto
Antoni4


0

Isso obtém o código de fuso horário (por exemplo, GMT) em javascript mais antigo (estou usando o Google App Script com mecanismo antigo):

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

Só estou colocando isso aqui para o caso de alguém precisar.


1
Acho que só funciona para UTC/ GMT. Parece que outros estão explicados; por exemplo, Pacific Daylight Time.
Ian Dunn,

-1

Experimente este código, consulte aqui

<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

Em javascript, o método Date.getTimezoneOffset () retorna o deslocamento do fuso horário do UTC, em minutos, para o local atual.

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

Moment'timezone será uma ferramenta útil. http://momentjs.com/timezone/

Converter datas entre fusos horários

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
Você não entendeu o que.
srsajid

3
Seus exemplos de código não estão relacionados à pergunta original. Como você usaria esta biblioteca para retornar o nome do fuso horário atual do usuário?
Joe White
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.