Este é um pouco do meu código JS para o qual é necessário:
var secDiff = Math.abs(Math.round((utc_date-this.premiere_date)/1000));
this.years = this.calculateUnit(secDiff,(86400*365));
this.days = this.calculateUnit(secDiff-(this.years*(86400*365)),86400);
this.hours = this.calculateUnit((secDiff-(this.years*(86400*365))-(this.days*86400)),3600);
this.minutes = this.calculateUnit((secDiff-(this.years*(86400*365))-(this.days*86400)-(this.hours*3600)),60);
this.seconds = this.calculateUnit((secDiff-(this.years*(86400*365))-(this.days*86400)-(this.hours*3600)-(this.minutes*60)),1);
Quero obter a data e hora em "atrás", mas se o horário de verão estiver em uso, as datas serão desativadas em 1 hora. Não sei como verificar se o horário de verão está em vigor ou não.
Como posso saber quando o horário de verão começa e termina?
fonte
getTimezoneOffset
retorna o valor inverso,Math.max
está retornando o deslocamento padrão . O código está correto.Crie duas datas: uma em junho e outra em janeiro. Compare seus valores getTimezoneOffset ().
Agora verifique getTimezoneOffset () da data atual.
fonte
Essa resposta é bastante semelhante à resposta aceita, mas não substitui o
Date
protótipo e usa apenas uma chamada de função para verificar se o horário de verão está em vigor, em vez de duas.A idéia é que, como nenhum país observa o horário de verão com duração de 7 meses [1] , em uma área que observa o horário de verão, o deslocamento da hora UTC em janeiro será diferente da de julho.
Enquanto o horário de verão move os relógios para frente , o JavaScript sempre retorna um valor maior durante o horário padrão. Portanto, obter o deslocamento mínimo entre janeiro e julho obterá o deslocamento do fuso horário durante o horário de verão.
Em seguida, verificamos se o fuso horário das datas é igual a esse valor mínimo. Se for, então estamos no horário de verão; caso contrário, não somos.
A função a seguir usa esse algoritmo. Ele pega um objeto de data
d
, e retornatrue
se o horário de verão estiver em vigor para essa data efalse
se não estiver:fonte
Math.max(...) != d.get...()
, ele retornará verdadeiro se o horário de verão for observado no fuso horário especificado E a data estiver atualmente no horário de verão. Se o horário de verão não for observado ou a data corresponder ao deslocamento padrão, ele retornará falso.Hoje me deparei com esse mesmo problema, mas como o horário de verão começa e para em horários diferentes dos EUA (pelo menos no meu entendimento), usei uma rota um pouco diferente.
Em seguida, basta comparar o deslocamento do fuso horário atual com o horário de verão e o DSDS para ver qual deles corresponde.
fonte
Com base no comentário de Matt Johanson sobre a solução fornecida por Sheldon Griffin, criei o seguinte código:
Ele tenta obter o melhor de todos os mundos, levando em consideração todos os comentários e respostas sugeridas anteriormente, e especificamente:
1) Armazena em cache o resultado para stdTimezoneOffset por ano, para que você não precise recalculá-lo ao testar várias datas no mesmo ano.
2) Ele não assume que o horário de verão (se houver) seja necessariamente em julho e funcionará mesmo que em algum momento e local seja em qualquer mês. No entanto, em termos de desempenho, ele funcionará mais rápido se de fato julho (ou quase meses) for de fato o horário de verão.
3) Na pior das hipóteses, ele comparará o getTimezoneOffset do primeiro de cada mês. [e faça isso uma vez por ano testado].
A suposição que ele ainda faz é que, se houver um período de horário de verão, será maior que um mês.
Se alguém quiser remover essa suposição, ele pode mudar o loop para algo mais parecido com o que é fornecido pela Aaron Cole - mas eu ainda pularia meio ano à frente e sairia do loop quando forem encontradas duas compensações diferentes]
fonte
A biblioteca moment.js fornece um
.isDst()
método para seus objetos de tempo.fonte
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.
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.
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.
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?
Bem, hoje é no inverno ou no verão? Se você soubesse disso, poderia aplicar a seguinte lógica:
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 é:
Função para determinar se o fuso horário no navegador usa DST:
fonte
Use Moment.js ( https://momentjs.com/ )
moment().isDST();
fornecerá se o horário de verão for observado.Também tem função auxiliar para calcular o tempo relativo para você. Você não precisa fazer cálculos manuais, por exemplo
moment("20200105", "YYYYMMDD").fromNow();
fonte
Você está perto, mas um pouco fora. Você nunca precisa calcular seu próprio tempo, pois é o resultado de seu próprio relógio. Ele pode detectar se você está usando o horário de verão em seu local, mas não em um local remoto produzido pelo deslocamento:
Isso ainda estará errado e ocorrerá uma hora se estiverem no horário de verão. Você precisa de uma conta de horário remoto se eles estiverem dentro do horário de verão ou não e ajustar de acordo. tente calcular isso e mude seu relógio para - digamos 1/1/2015 e redefina o relógio uma hora como se estivesse fora do horário de verão. Em seguida, calcule um deslocamento para um local que ainda deve estar 2 horas atrasado. Ele será exibido uma hora antes da janela de duas horas. Você ainda precisaria contabilizar a hora e ajustar. Eu fiz isso para NY e Denver e sempre vou para o incorreto (uma hora à frente) em Denver.
fonte
Descobri que o uso da biblioteca Moment.js com alguns dos conceitos descritos aqui (comparando janeiro a junho) funciona muito bem.
Esta função simples retornará se o fuso horário em que o usuário está observa o horário de verão:
Uma maneira simples de verificar se isso funciona (no Windows) é alterar o fuso horário para uma zona não DST, por exemplo, o Arizona retornará falso, enquanto EST ou PST retornará verdadeiro.
fonte
Solução à prova de futuro que funciona em todos os fusos horários
x
o número esperado de milissegundos no ano de interesse sem considerar o horário de verão.y
o número de milissegundos desde a época desde o início do ano da data de interesse.z
o número de milissegundos desde a época da data e hora completas do interesset
ser a subtração de ambosx
ey
dez
:z - y - x
. Isso produz o deslocamento devido ao horário de verão.t
for zero, o horário de verão não está em vigor. Set
não for zero, o horário de verão está em vigor.Acredito que o snippet de código acima é superior a todas as outras respostas postadas aqui por vários motivos.
No entanto, se você não estiver se preparando para mais de 2 períodos de horário de verão, o código abaixo pode ser usado para determinar se o horário de verão está em vigor como um booleano.
fonte
Recentemente, precisei criar uma string de data com UTC e DST e, com base na resposta de Sheldon, montei isso:
fonte
Existe um problema ao usar o
Date.toString().indexOf('Daylight Time') > -1
"" + new Date()
"" + new Date(...)
Isso parece compatível com todos os navegadores.
fonte
"Thu Jul 02 2020 14:07:01 GMT+0200 (Central European Summer Time)"
Estilo ES6
fonte