Tenho data e hora em um fuso horário específico como uma sequência e quero convertê-la para a hora local. Mas não sei como definir o fuso horário no objeto Data.
Por exemplo, eu tenho, Feb 28 2013 7:00 PM ET,
então eu posso
var mydate = new Date();
mydate.setFullYear(2013);
mydate.setMonth(02);
mydate.setDate(28);
mydate.setHours(7);
mydate.setMinutes(00);
Tanto quanto sei, posso definir a hora UTC ou a hora local. Mas como faço para definir a hora em outro fuso horário?
Tentei usar a adição / subtração do deslocamento do UTC, mas não sei como combater o horário de verão. Não tenho certeza se estou indo na direção certa.
Como posso converter a hora de um fuso horário diferente para a hora local em javascript?
javascript
timezone
pavanred
fonte
fonte
Respostas:
fundo
O
Date
objeto JavaScript rastreia o tempo no UTC internamente, mas normalmente aceita entrada e produz saída no horário local do computador em que está sendo executado. Possui muito poucas facilidades para trabalhar com o horário em outros fusos horários.A representação interna de um
Date
objeto é um número único, representando o número de milissegundos decorridos desde então1970-01-01 00:00:00 UTC
, sem considerar os segundos bissextos. Não há fuso horário ou formato de string armazenado no próprio objeto Date. Quando várias funções doDate
objeto são usadas, o fuso horário local do computador é aplicado à representação interna. Se a função produzir uma sequência, as informações de localidade do computador poderão ser levadas em consideração para determinar como produzir essa sequência. Os detalhes variam de acordo com a função e alguns são específicos da implementação.As únicas operações que o
Date
objeto pode realizar com fusos horários não locais são:Ele pode analisar uma string contendo um deslocamento numérico do UTC de qualquer fuso horário. Ele usa isso para ajustar o valor que está sendo analisado e armazena o equivalente ao UTC. A hora local original e o deslocamento não são mantidos no
Date
objeto resultante . Por exemplo:Em ambientes que implementaram a API de Internacionalização do ECMASCript (também conhecida como "Intl"), um
Date
objeto pode produzir uma sequência específica de localidade ajustada para um determinado identificador de fuso horário. Isso é realizado através datimeZone
opçãotoLocaleString
e suas variações. A maioria das implementações suporta identificadores de fuso horário da IANA, como'America/New_York'
. Por exemplo:A maioria dos ambientes modernos oferece suporte ao conjunto completo de identificadores de fuso horário da IANA ( consulte a tabela de compatibilidade aqui ). No entanto, lembre-se de que o único identificador necessário para ser suportado pelo Intl é
'UTC'
, portanto, você deve verificar cuidadosamente se precisa oferecer suporte a navegadores mais antigos ou ambientes atípicos (por exemplo, dispositivos IoT leves).Bibliotecas
Existem várias bibliotecas que podem ser usadas para trabalhar com fusos horários. Embora eles ainda não possam fazer com que o
Date
objeto se comporte de maneira diferente, eles normalmente implementam o banco de dados de fuso horário da IANA padrão e fornecem funções para usá-lo em JavaScript. Bibliotecas modernas usam os dados de fuso horário fornecidos pela API Intl, mas as bibliotecas mais antigas geralmente têm sobrecarga, especialmente se você estiver executando em um navegador da Web, pois o banco de dados pode ficar um pouco grande. Algumas dessas bibliotecas também permitem reduzir seletivamente o conjunto de dados, pelo horário em que os fusos horários são suportados e / ou pelo intervalo de datas com o qual você pode trabalhar.Aqui estão as bibliotecas a serem consideradas:
Bibliotecas baseadas em Intl
O novo desenvolvimento deve escolher uma dessas implementações, que dependem da API Intl para seus dados de fuso horário:
Bibliotecas Não Intl
Essas bibliotecas são mantidas, mas carregam o fardo de empacotar seus próprios dados de fuso horário, que podem ser bastante grandes.
* Embora Moment e Moment-Timezone tenham sido recomendados anteriormente, a equipe do Moment agora prefere que os usuários escolham o Luxon para um novo desenvolvimento.
Bibliotecas descontinuadas
Essas bibliotecas foram oficialmente descontinuadas e não devem mais ser usadas.
Propostas futuras
A proposta temporal do TC39 visa fornecer um novo conjunto de objetos padrão para trabalhar com datas e horas no próprio idioma JavaScript. Isso incluirá suporte para um objeto com reconhecimento de fuso horário.
fonte
var date_time = new Date()
, o valor dedate_time
é (para mim em Brasília)Date {Sun Aug 21 2016 22:18:47 GMT+1000 (AEST)}
e assim, portanto, parece que tem armazenado um fuso horário. Como posso garantir quedate_time
a hora UTC é puramente, sem nenhum fuso horário incluído?new Date().getTime();
Como Matt Johnson disse
Portanto, embora o navegador não consiga ler os fusos horários da IANA ao criar uma data ou tenha métodos para alterar os fusos horários em um objeto Date existente, parece haver uma invasão:
fonte
toLocaleString
para obter o efeito inverso, e sim, isso deve ser do conhecimento geral! vá escrever um artigo sobre isso e me mencionar :-)Date
objeto que ele retorna é uma mentira. Até o exemplo mostrado, a saída da string inclui o fuso horário da máquina local. No meu computador, ambos os resultados dizem "GMT-0700 (Horário de verão do Pacífico)", onde isso é correto apenas para o primeiro (Toronto está realmente no horário do leste). Além da saída da string, o registro de data e hora contido noDate
objeto foi mudou para um ponto diferente no tempo. Essa pode ser uma técnica útil, mas vem com muitas ressalvas - principalmente porque asDate
funções do objeto não terão saída normal.Você pode especificar um deslocamento de fuso horário
new Date()
, por exemplo:ou
Desde a
Date
hora UTC da loja (ou seja,getTime
retorna em UTC), o javascript os converterá em UTC, e quando você chamar coisas comotoString
javascript converterá o horário UTC no fuso horário local do navegador e retornará a string no fuso horário local, ou seja, se eu estiver usandoUTC+8
:Além disso, você pode usar o
getHours/Minute/Second
método normal :(Isso
8
significa que após o horário ser convertido em meu horário local -UTC+8
, o número de horas é8
.)fonte
Isso deve resolver seu problema, fique à vontade para oferecer correções. Este método também considerará o horário de verão para a data especificada.
Como usar com fuso horário e hora local:
fonte
tzDate
diretamente?Eu achei a maneira mais suportada de fazer isso, sem me preocupar com uma biblioteca de terceiros, usando
getTimezoneOffset
para calcular o carimbo de data / hora apropriado ou atualizar a hora e, em seguida, usar os métodos normais para obter a data e hora necessárias.EDITAR
Eu estava usando
UTC
métodos anteriormente ao executar as transformações de data, que estavam incorretas. Ao adicionar o deslocamento à hora, o uso dasget
funções locais retornará os resultados desejados.fonte
timezone_offset
?timezone_offset
deveria ter sidooffset
, ou vice-versa. Editei minha resposta para mostrar o nome correto da variável.Eu tive um problema semelhante com testes de unidade (especificamente em tom de brincadeira quando os testes de unidade são executados localmente para criar os instantâneos e, em seguida, o servidor de CI executa (potencialmente) em um fuso horário diferente, causando falha na comparação de instantâneos. Eu zombei do nosso
Date
e de alguns dos métodos de suporte como:fonte
Tente usar o ctoc da npm. https://www.npmjs.com/package/ctoc_timezone
Ele tem uma funcionalidade simples para alterar os fusos horários (a maioria dos fusos horários é de cerca de 400) e todos os formatos personalizados que você deseja exibir.
fonte
Com base nas respostas acima, estou usando esse forro nativo para converter a cadeia longa de fuso horário na cadeia de três letras:
Isso fornecerá PDT ou PST, dependendo da data fornecida. No meu caso de uso específico, desenvolvendo no Salesforce (Aura / Lightning), podemos obter o fuso horário do usuário no formato longo a partir do back-end.
fonte
Sei que são 3 anos tarde demais, mas talvez isso possa ajudar outra pessoa, porque não encontrei nada assim, exceto a biblioteca de fuso horário, que não é exatamente a mesma que ele está pedindo aqui.
Eu fiz algo semelhante para o fuso horário alemão, isso é um pouco complexo devido ao horário de verão e aos anos bissextos em que você tem 366 dias.
pode ser necessário um pouco de trabalho com a função "isDaylightSavingTimeInGermany", enquanto diferentes fusos horários mudam em horários diferentes do horário de verão.
de qualquer forma, confira esta página: https://github.com/zerkotin/german-timezone-converter/wiki
os principais métodos são: convertLocalDateToGermanTimezone convertGermanDateToLocalTimezone
Eu me esforcei para documentá-lo, para que não seja tão confuso.
fonte
Experimente: date-from-timezone , resolve a data esperada com a ajuda de nativamente disponíveis
Intl.DateTimeFormat
.Eu já usei esse método em um de meus projetos há alguns anos, mas agora decidi publicá-lo como um pequeno projeto de sistema operacional :)
fonte
Para usuários Ionic, eu tive um problema com isso, porque
.toISOString()
tem que ser usado com o modelo html.Isso agarra a data atual, mas é claro que pode ser adicionado às respostas anteriores para uma data selecionada.
Eu o consertei usando isso:
O * 60000 indica o UTC -6, que é CST, portanto, seja qual for o fuso horário, o número e a diferença podem ser alterados.
fonte
Talvez isso ajude você
fonte
Estava enfrentando o mesmo problema, usou este
Console.log (Date.parse ("13 de junho de 2018 10:50:39 GMT + 1"));
Ele retornará milissegundos aos quais você pode verificar, ter +100 fuso horário inicializando o horário britânico Espero que ajude !!
fonte