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?

Mike Thomsen
fonte
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.

Daniel Compton
fonte
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.

mrnateriver
fonte
3

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

moment.tz.guess();
Omer
fonte
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.

toddmo
fonte
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>
Kumar Shanmugam
fonte
-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
user3345614
fonte
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