Como posso coletar informações de fuso horário do visitante? Preciso do fuso horário e das horas de deslocamento GMT.
Como posso coletar informações de fuso horário do visitante? Preciso do fuso horário e das horas de deslocamento GMT.
Respostas:
var offset = new Date().getTimezoneOffset();
console.log(offset);
O deslocamento do fuso horário é a diferença, em minutos, entre o UTC e a hora local. Observe que isso significa que o deslocamento é positivo se o fuso horário local estiver atrás do UTC e negativo se estiver adiantado. Por exemplo, se o seu fuso horário for UTC + 10 (Horário Padrão do Leste da Austrália), -600 será retornado. O horário de verão impede que esse valor seja constante, mesmo para um determinado local
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).
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 que jsTimezoneDetect
você apontou se usa getTimezoneOffset
.
var hrs = -(new Date().getTimezoneOffset() / 60)
para se compensar em horas tipicamente usado
timezone
! =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
console.log(Intl.DateTimeFormat().resolvedOptions().timeZone)
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.
Nesta versão da API de internacionalização do ECMAScript, a
timeZone
propriedade permanecerá indefinida se nenhumatimeZone
propriedade foi fornecida no objeto de opções fornecido aoIntl.DateTimeFormat
construtor . No entanto, os aplicativos não devem confiar nisso, pois versões futuras podem retornar um valor String identificando o fuso horário atual do ambiente host.
no ecma-402 / 3.0, que ainda está em rascunho, foi alterado para
Nesta versão da API de internacionalização do ECMAScript 2015, a
timeZone
propriedade será o nome do fuso horário padrão se nenhumatimeZone
propriedade tiver sido fornecida no objeto de opções fornecido aoIntl.DateTimeFormat
construtor. A versão anterior deixou atimeZone
propriedade indefinida neste caso.
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:
var split = new Date().toString().split(" ");
var timeZoneFormatted = split[split.length - 2] + " " + split[split.length - 1];
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)":
new Date().toString().match(/([A-Z]+[\+-][0-9]+.*)/)[1]
Para "GMT-0400":
new Date().toString().match(/([A-Z]+[\+-][0-9]+)/)[1]
Por apenas "EDT":
new Date().toString().match(/\(([A-Za-z\s].*)\)/)[1]
Por apenas "-0400":
new Date().toString().match(/([-\+][0-9]+)\s/)[1]
Referência de Date.toString: https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Date/toString
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"
:
function pad(number, length){
var str = "" + number
while (str.length < length) {
str = '0'+str
}
return str
}
var offset = new Date().getTimezoneOffset()
offset = ((offset<0? '+':'-')+ // Note the reversed sign!
pad(parseInt(Math.abs(offset/60)), 2)+
pad(Math.abs(offset%60), 2))
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 esperado
Você pode usar:
<script src="moment.js"></script>
<script src="moment-timezone-with-data.js"></script>
// retrieve timezone by name (i.e. "America/Chicago")
moment.tz.guess();
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()
e Date.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.
console.log(moment.tz.guess()); // America/Chicago
Eu escrevi uma função no meu projeto, que retorna o fuso horário no hh:mm
formato. Espero que isso ajude alguém:
function getTimeZone() {
var offset = new Date().getTimezoneOffset(), o = Math.abs(offset);
return (offset < 0 ? "+" : "-") + ("00" + Math.floor(o / 60)).slice(-2) + ":" + ("00" + (o % 60)).slice(-2);
}
// Outputs: +5:00
Uma linha única que fornece o deslocamento e o fuso horário é simplesmente chamar toTimeString () em um novo objeto Date. Do MDN:
O
toTimeString()
método retorna a parte da hora de um objeto Date em formato legível por humanos no inglês americano.
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:
console.log(new Date().toTimeString().slice(9));
console.log(Intl.DateTimeFormat().resolvedOptions().timeZone);
console.log(new Date().getTimezoneOffset() / -60);
No momento, na Califórnia, toTimeString()
retorna Pacific Daylight Time
enquanto a API Intl retorna America/Los_Angeles
. Na Colômbia, que você deseja obter Colombia 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 :
As instâncias de data se referem a um momento específico. Chamar toString () retornará a data formatada em um formato legível por humanos no inglês americano. [...] Às vezes é desejável obter uma sequência da parte do tempo; uma coisa dessas pode ser realizada com o
toTimeString()
métodoO
toTimeString()
método é especialmente útil porque os mecanismos compatíveis que implementam o ECMA-262 podem diferir na sequência obtidatoString()
para osDate
objetos, pois o formato depende da implementação; abordagens simples de corte de cadeia podem não produzir resultados consistentes em vários mecanismos.
JavaScript:
var d = new Date();
var n = d.getTimezoneOffset();
var timezone = n / -60;
console.log(timezone);
Com moment.js :
moment().format('zz');
Z
eZZ
Com momentjs, você pode encontrar o fuso horário atual como
console.log(moment().utcOffset()); // (-240, -120, -60, 0, 60, 120, 240, etc.)
<script src="https://cdn.jsdelivr.net/momentjs/2.13.0/moment.min.js"></script>
Com dayjs, você pode encontrar o fuso horário atual como
console.log(dayjs().utcOffset()); // (-240, -120, -60, 0, 60, 120, 240, etc.)
<script src="https://unpkg.com/dayjs@1.8.10/dayjs.min.js"></script>
A API retorna o deslocamento utc em minutos.
getTimezoneOffset()
.
Fuso horário em horas-
var offset = new Date().getTimezoneOffset();
if(offset<0)
console.log( "Your timezone is- GMT+" + (offset/-60));
else
console.log( "Your timezone is- GMT-" + offset/60);
Se você quiser ser preciso, como mencionado no comentário, tente o seguinte:
var offset = new Date().getTimezoneOffset();
if(offset<0)
{
var extraZero = "";
if(-offset%60<10)
extraZero="0";
console.log( "Your timezone is- GMT+" + Math.ceil(offset/-60)+":"+extraZero+(-offset%60));
}
else
{
var extraZero = "";
if(offset%60<10)
extraZero="0";
console.log( "Your timezone is- GMT-" + Math.floor(offset/60)+":"+extraZero+(offset%60));
}
Se tudo o que você precisa é da abreviação de fuso horário "MST" ou "EST":
function getTimeZone(){
var now = new Date().toString();
var timeZone = now.replace(/.*[(](.*)[)].*/,'$1');//extracts the content between parenthesis
return timeZone;
}
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.
var a = new Date().getTimezoneOffset();
var res = -Math.round(a/60)+':'+-(a%60);
res = res < 0 ?res : '+'+res;
console.log(res)
round
? Deveria ser floor
, não é?
function getLocalTimeZone() {
var dd = new Date();
var ddStr = dd.toString();
var ddArr = ddStr.split(' ');
var tmznSTr = ddArr[5];
tmznSTr = tmznSTr.substring(3, tmznSTr.length);
return tmznSTr;
}
Exemplo: quinta-feira 21 de junho de 2018 18:12:50 GMT + 0530 (horário padrão da Índia)
O / P: +0530
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,
new Date().toString().split("GMT")[1].split(" (")[0]
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.
JS
function timezone() {
var offset = new Date().getTimezoneOffset();
var minutes = Math.abs(offset);
var hours = Math.floor(minutes / 60);
var prefix = offset < 0 ? "+" : "-";
return prefix+hours;
}
$('#result').html(timezone());
HTML
<div id="result"></div>
Resultado
+8
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.
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:
// For time zone:
const timeZone = /\((.*)\)/.exec(new Date().toString())[1];
// Offset hours:
const offsetHours = new Date().getTimezoneOffset() / 60;
console.log(`${timeZone}, ${offsetHours}hrs`);
Como alternativa new Date().getTimezoneOffset()
e moment().format('zz')
, você também pode usarmomentjs:
var offset = moment.parseZone(Date.now()).utcOffset() / 60
console.log(offset);
<script src="https://cdn.jsdelivr.net/momentjs/2.13.0/moment.min.js"></script>
O jstimezone também é bastante complicado e não mantém manutenção ( https://bitbucket.org/pellepim/jstimezonedetect/issues?status=new&status=open )
Use isto para converter OffSet em positivo:
var offset = new Date().getTimezoneOffset();
console.log(offset);
this.timeOffSet = offset + (-2*offset);
console.log(this.timeOffSet);
Eu estava procurando apenas a sequência de três letras (como "PDT") e tentei a resposta de Marquez, mas tive que ajustá-la um pouco para obter suporte entre navegadores. Felizmente, a string é a última correspondência potencial :)
Aqui está o que eu fiz, no CoffeeScript:
browserTimezone = ->
userDate = new Date()
zoneMatches = userDate.toString().match(/([A-Z][A-Z][A-Z])/g)
userZone = zoneMatches[zoneMatches.length - 1]
Funciona no IE8, IE9, Safari 9, Firefox 44 e Chrome 48
Date.toString()
não é confiável e o MDN explica o porquê. Colei a seção relevante dos documentos deles na minha resposta .
Você apenas inclui moment.js e jstz.js
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.17.1/moment.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jstimezonedetect/1.0.6/jstz.min.js"></script>
e depois disso
<script>
$(function(){
var currentTimezone = jstz.determine();
var timezone = currentTimezone.name();
alert(timezone);
});
</script>
você pode simplesmente tentar isso. ele retornará o tempo atual da máquina
var _d = new Date(), t = 0, d = new Date(t*1000 + _d.getTime())
new Date(new Date().getTime());
seria exibido: "Sex 28 de dezembro de 2018 10:15:23 GMT + 0100 (Horário padrão da Europa Central) {}"