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?
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?
Respostas:
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 timeZone
propriedade é definida como undefined
em 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.
A resposta mais votada é provavelmente a melhor maneira de obter o fuso horário, no entanto, Intl.DateTimeFormat().resolvedOptions().timeZone
retorna 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 Date
da 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.
Você pode usar este script. http://pellepim.bitbucket.org/jstz/
Repositório bifurcado ou clone aqui. https://bitbucket.org/pellepim/jstimezonedetect
Depois de incluir o script, você pode obter a lista de fusos horários na jstz.olson.timezones
variável.
E o código a seguir é usado para determinar o fuso horário do navegador do cliente.
var tz = jstz.determine();
tz.name();
Aproveite o jstz!
Recuperar fuso horário por nome (ou seja, "América / Nova York")
moment.tz.guess();
Intl.DateTimeFormat().resolvedOptions().timeZone
Intl.DateTimeFormat().resolvedOptions().timeZone
retorna undefined
, mas moment.tz.guess()
retorna o valor correto
Você pode simplesmente escrever seu próprio código usando a tabela de mapeamento aqui: http://www.timeanddate.com/time/zones/
ou use a biblioteca de fuso horário de momento: http://momentjs.com/timezone/docs/
Vejo zone.name; // America/Los_Angeles
ou esta biblioteca: https://github.com/Canop/tzdetect.js
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.
UTC
/ GMT
. Parece que outros estão explicados; por exemplo, Pacific Daylight Time
.
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>
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