O getTimezoneOffset()
método em JavaScript, em um navegador, retorna o número de minutos deslocados do fuso horário 00:00. Por exemplo, o fuso horário America / New_York no horário de verão (DST) retorna o número 300. 300 minutos é uma diferença de 5 horas em relação a zero. 300 minutos dividido por 60 minutos é de 5 horas. Cada fuso horário é comparado ao fuso horário zero, +00: 00 / Etc / GMT / Greenwich.
Documentos da Web MDN
A próxima coisa que você deve saber é que o deslocamento tem o sinal oposto do fuso horário real.
As informações sobre fusos horários são mantidas pela Internet Assigned Numbers Authority (iana)
fusos horários de iana
Uma tabela de fusos horários bem formatada é fornecida por joda.org
fusos horários
+00: 00 ou Etc / GMT é hora de Greenwich
Todos os fusos horários são compensados a partir das +00: 00 / "Etc / GMT" / hora de Greenwich
O horário de verão é sempre um horário anterior ao horário "normal" no verão. Você ajusta seus relógios de volta no outono. (Slogan "Recuar" para lembrar o que fazer)
Portanto, o horário America / New_York no horário de verão (inverno) é uma hora antes do horário normal. Assim, por exemplo, o que normalmente eram 17:00 da tarde na cidade de Nova York no verão, agora são 16:00 da América / Nova_York no horário de verão. O nome "America / New_York" é um nome de fuso horário "Long Format". A costa leste dos EUA normalmente chama seu fuso horário Horário Padrão do Leste (EST)
Se você deseja comparar o deslocamento do fuso horário de hoje com o deslocamento do fuso horário de outra data, você precisa saber que o sinal matemático (+/- "Positivo / Negativo") do deslocamento do fuso horário é o oposto do fuso horário.
Veja a tabela de fuso horário em joda.org e encontre o fuso horário para "America / New_York". Ele terá um sinal negativo na frente do deslocamento padrão.
A Terra gira no sentido anti-horário no seu eixo. Uma pessoa vê o nascer do sol em Greenwich vê o nascer do sol 5 horas antes de alguém em Nova York ver o nascer do sol. E alguém na costa oeste dos EUA verá o nascer do sol depois que alguém na costa leste dos EUA verá o nascer do sol.
Há uma razão pela qual você precisa saber tudo isso. Para que você possa determinar logicamente se algum código JavaScript está recebendo o status do horário de verão ou não, sem precisar testar todos os fusos horários em diferentes épocas do ano.
Imagine que seja novembro na cidade de Nova York, e os relógios tenham atrasado uma hora. No verão, na cidade de Nova York, o deslocamento é de 240 minutos ou 4 horas.
Você pode testar isso criando uma data em julho e obtendo o deslocamento.
var July_Date = new Date(2017, 6, 1);
var july_Timezone_OffSet = July_Date.getTimezoneOffset();
console.log('july_Timezone_OffSet: ' + july_Timezone_OffSet)
O que será impresso no log do console das ferramentas do desenvolvedor do navegador?
Resposta é: 240
Portanto, agora você pode criar uma data em janeiro e ver o que o navegador retorna para um deslocamento de fuso horário para a temporada de inverno.
var Jan_Date = new Date(2017, 0, 1);//Month is zero indexed - Jan is zero
var jan_Timezone_OffSet = Jan_Date.getTimezoneOffset();
console.log('jan_Timezone_OffSet: ' + jan_Timezone_OffSet)
Resposta é: 300
Obviamente 300 é maior que 240. Então, o que isso significa? Você deve escrever um código que testa o deslocamento de inverno maior que o deslocamento de verão? Ou o verão compensou menos que o inverno? Se houver uma diferença entre as compensações de fuso horário de verão e inverno, você poderá assumir que o horário de verão está sendo usado para esse fuso horário. Mas isso não informa se hoje está usando o horário de verão para o fuso horário do navegador. Portanto, você precisará obter o deslocamento do fuso horário para hoje.
var today = new Date();
var todaysTimeZone = today.getTimezoneOffset();
console.log('todaysTimeZone : ' + todaysTimeZone)
A resposta é: ? - Depende da época do ano
Se o deslocamento de fuso horário de hoje e o deslocamento de fuso horário de verão forem os mesmos, E as compensações de fuso horário de verão e inverno forem diferentes, por dedução lógica, hoje NÃO deverá estar no horário de verão.
Você pode omitir a comparação das compensações de fuso horário de verão e inverno (para saber se o horário de verão é usado para esse fuso horário) e apenas comparar o deslocamento de fuso horário de hoje com o deslocamento de TZ do verão e obter sempre a resposta correta?
today's TZ Offset !== Summer TZ Offset
Bem, hoje é no inverno ou no verão? Se você soubesse disso, poderia aplicar a seguinte lógica:
if ( it_is_winter && ( todays_TZ_Offset !== summer_TZ_Offset) {
var are_We_In_DST = true;
}
Mas o problema é que você não sabe se a data de hoje é no inverno ou no verão. Todo fuso horário pode ter suas próprias regras para quando o horário de verão inicia e para. Você precisaria acompanhar as regras de todos os fusos horários para todos os fusos horários do mundo. Portanto, se houver uma maneira melhor e mais fácil, é melhor fazê-lo da maneira melhor e mais fácil.
O que nos resta é que você precisa saber se esse fuso horário usa o horário de verão e comparar o deslocamento de fuso horário de hoje com o deslocamento de fuso horário de verão. Isso sempre lhe dará uma resposta confiável.
A lógica final é:
if ( DST_Is_Used_In_This_Time_Zone && ( todays_TZ_Offset !== summer_TZ_Offset) {
var are_We_In_DST = true;
}
Função para determinar se o fuso horário no navegador usa DST:
function is_DST_Used_In_This_TimeZone() {
var Jan_Date, jan_Timezone_OffSet, July_Date, july_Timezone_OffSet
offsetsNotEqual, thisYear, today;
today = new Date();//Create a date object that is now
thisYear = today.getFullYear();//Get the year as a number
Jan_Date = new Date(thisYear, 0, 1);//Month is zero indexed - Jan is zero
jan_Timezone_OffSet = Jan_Date.getTimezoneOffset();
console.log('jan_Timezone_OffSet: ' + jan_Timezone_OffSet)
July_Date = new Date(thisYear, 6, 1);
july_Timezone_OffSet = July_Date.getTimezoneOffset();
console.log('july_Timezone_OffSet: ' + july_Timezone_OffSet)
offsetsNotEqual = july_Timezone_OffSet !== jan_Timezone_OffSet;//True if not equal
console.log('offsetsNotEqual: ' + offsetsNotEqual);
return offsetsNotEqual;//If the offsets are not equal for summer and
//winter then the only possible reason is that DST is used for
//this time zone
}
getTimezoneOffset
retorna o valor inverso,Math.max
está retornando o deslocamento padrão . O código está correto.