Como posso coletar informações de fuso horário do visitante? Preciso do fuso horário e das horas de deslocamento GMT.
javascript
timezone
Controlaríztűrő tükörfúrógép
fonte
fonte
Respostas:
Observe que nem todos os fusos horários são compensados por horas inteiras: por exemplo, Terra Nova é UTC menos 3h 30m (deixando o Horário de verão fora da equação).
fonte
getTimezoneOffset
imprecisão está em vigor? O artigo a que você está se referindo é datado de junho de 2007 e não possui detalhes de como a função é imprecisa. E, de fato, a biblioteca quejsTimezoneDetect
você apontou se usagetTimezoneOffset
.var hrs = -(new Date().getTimezoneOffset() / 60)
para se compensar em horas tipicamente usadotimezone
! =utc offset
Usar um deslocamento para calcular o fuso horário é uma abordagem incorreta e você sempre encontrará problemas. Os fusos horários e as regras de horário de verão podem mudar em várias ocasiões durante um ano, e é difícil acompanhar as alterações.
Para obter o fuso horário da IANA do sistema em JavaScript, você deve usar
Em setembro de 2019, isso funcionaria em 95% dos navegadores usados globalmente .
Informações antigas de compatibilidade
O ecma-402 / 1.0 diz que
timeZone
pode ser indefinido se não for fornecido ao construtor. No entanto, o rascunho futuro (3.0) corrigiu esse problema alterando para o fuso horário padrão do sistema.no ecma-402 / 3.0, que ainda está em rascunho, foi alterado para
fonte
Sei que essa resposta é um pouco fora do tópico, mas imagino que muitos de nós procurando uma resposta também queriam formatar o fuso horário para exibição e talvez também obter a abreviação de zona. Então aqui vai ...
Se você deseja que o fuso horário do cliente seja bem formatado, pode confiar no método JavaScript Date.toString e fazer:
Isso fornecerá "GMT-0400 (EST)", por exemplo, incluindo os minutos do fuso horário, quando aplicável.
Como alternativa, com o regex, você pode extrair qualquer parte desejada:
Para "GMT-0400 (EDT)":
Para "GMT-0400":
Por apenas "EDT":
Por apenas "-0400":
Referência de Date.toString: https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Date/toString
fonte
split[4] + " " + split[5]
?!split
contém:["Mon", "Mar", "13", "2017", "14:05:22", "GMT-0400", "(Eastern", "Daylight", "Time)"]
então o resultado é #Daylight Time)
new Date().toString()
depende completamente das configurações de localidade. Esperar que os resultados de outros clientes se assemelhem aos seus é uma péssima idéia.Já foi respondido como obter o deslocamento em minutos como um número inteiro, mas caso alguém queira o deslocamento GMT local como uma sequência, por exemplo
"+1130"
:fonte
pad(parseInt(Math.abs(offset/60)), 2)
para acertar ... caso contrário, você poderá obter +5.530, como no meu caso ... não tenho certeza se o piso de matemática etc. será uma coisa melhor aqui ou não ... mas isso pelo menos me dá +530 conforme o esperadoVocê pode usar:
fuso horário
A detecção do fuso horário do navegador é bastante complicada de corrigir, pois há pouca informação fornecida pelo navegador.
Momento O fuso horário usa
Date.getTimezoneOffset()
eDate.toString()
em alguns momentos do ano atual para reunir o máximo de informações possível sobre o ambiente do navegador. Em seguida, compara essas informações com todos os dados de fuso horário carregados e retorna a correspondência mais próxima. Em caso de empate, o fuso horário da cidade com maior população é retornado.fonte
Eu escrevi uma função no meu projeto, que retorna o fuso horário no
hh:mm
formato. Espero que isso ajude alguém:Mostrar snippet de código
Violino de trabalho
fonte
Uma linha única que fornece o deslocamento e o fuso horário é simplesmente chamar toTimeString () em um novo objeto Date. Do MDN:
O problema é que o fuso horário não está no formato padrão da IANA; é um pouco mais amigável do que o formato IANA "continente / cidade" . Experimente:
No momento, na Califórnia,
toTimeString()
retornaPacific Daylight Time
enquanto a API Intl retornaAmerica/Los_Angeles
. Na Colômbia, que você deseja obterColombia Standard Time
, vs.America/Bogota
.Observe que muitas outras respostas para esta pergunta tentam obter as mesmas informações chamando Date.toString (). Essa abordagem não é tão confiável, como a MDN explica :
fonte
tentativa
getTimezoneOffset()
doDate
objeto:Esse método retorna o deslocamento do fuso horário em minutos, que é a diferença entre GMT e o horário local em minutos.
fonte
JavaScript:
fonte
Com moment.js :
fonte
z
ezz
foi descontinuado a partir da versãoZ
eZZ
.zoneAbbr()
foi substituídoz
ezz
. Veja a documentação aquiCom momentjs, você pode encontrar o fuso horário atual como
Com dayjs, você pode encontrar o fuso horário atual como
A API retorna o deslocamento utc em minutos.
fonte
getTimezoneOffset()
.Fuso horário em horas-
Se você quiser ser preciso, como mencionado no comentário, tente o seguinte:
fonte
Se tudo o que você precisa é da abreviação de fuso horário "MST" ou "EST":
fonte
Date.toString()
não é confiável e o MDN explica o porquê. Colei a seção relevante dos documentos deles na minha resposta .Veja que este operador resultante era oposto ao fuso horário. Portanto, aplique alguma função matemática e valide o número menor ou mais.
Veja o documento MDN
fonte
round
? Deveria serfloor
, não é?Exemplo: quinta-feira 21 de junho de 2018 18:12:50 GMT + 0530 (horário padrão da Índia)
O / P: +0530
fonte
Date.toString()
não é confiável e o MDN explica o porquê. Colei a seção relevante dos documentos deles na minha resposta .Tente isso,
fonte
Esse valor é da máquina do usuário e pode ser alterado a qualquer momento, por isso acho que não importa, só quero obter um valor aproximado e depois convertê-lo em GMT no meu servidor.
Por exemplo, sou de Taiwan e retorna "+8" para mim.
Exemplo de trabalho
JS
HTML
Resultado
fonte
No
new Date(
) você pode obter o deslocamento, para obter o nome do fuso horário que você pode fazer:new Date().toString().replace(/(.*\((.*)\).*)/, '$2');
você obtém o valor
()
no final da data, que é o nome do fuso horário.fonte
Date.toString()
não é confiável e o MDN explica o porquê. Colei a seção relevante dos documentos deles na minha resposta . Além disso, esta resposta já foi dada pelo menos três vezes.Esta seria a minha solução: