Em um aplicativo JS, recebo o carimbo de data / hora (eq. 1270544790922
) Do servidor (Ajax).
Com base nesse carimbo de data / hora, crio o Date
objeto usando:
var _date = new Date();
_date.setTime(1270544790922);
Agora, _date
timestamp decodificado no fuso horário local do usuário atual. Eu não quero isso.
Gostaria de _ date
converter este carimbo de data / hora para a hora atual na cidade de Helsinque, na Europa (desconsiderando o fuso horário atual do usuário).
Como eu posso fazer isso?
javascript
date
timezone
warpech
fonte
fonte
Respostas:
O valor subjacente de um objeto Date está, na verdade, em UTC. Para provar isso, observe que se você digitar
new Date(0)
você vai ver algo como:Wed Dec 31 1969 16:00:00 GMT-0800 (PST)
. 0 é tratado como 0 no GMT, mas o.toString()
método mostra a hora local.Nota importante, UTC significa código de tempo universal . A hora atual agora em 2 lugares diferentes é o mesmo UTC, mas a saída pode ser formatada de forma diferente.
O que precisamos aqui é alguma formatação
Isso funciona, mas ... você não pode realmente usar qualquer um dos outros métodos de data para seus propósitos, pois eles descrevem o fuso horário do usuário. O que você deseja é um objeto de data relacionado ao fuso horário de Helsinque. Suas opções neste ponto são usar alguma biblioteca de terceiros (eu recomendo isso), ou hackear o objeto de data para que você possa usar a maioria de seus métodos.
Opção 1 - um terceiro, como fuso horário
Isso parece muito mais elegante do que o que vamos fazer a seguir.
Opção 2 - hackear o objeto de data
Ele ainda pensa que é GMT-0700 (PDT), mas se você não olhar muito fixamente, pode ser capaz de confundir isso com um objeto de data que é útil para seus propósitos.
Eu convenientemente pulei uma parte. Você precisa ser capaz de definir
currentHelsinkiOffset
. Se você puder usardate.getTimezoneOffset()
no lado do servidor ou apenas usar algumas instruções if para descrever quando ocorrerão as alterações de fuso horário, isso deve resolver o seu problema.Conclusão - acho que, especialmente para esse propósito, você deve usar uma biblioteca de datas como o fuso horário do momento .
fonte
*60*60
deveria ser*60000
, já que getTime está em milissegundos e getTimezoneOffset está em minutos, dos quais existem 60.000 milissegundos em um minuto, não 60 * 60 == 3600Para contabilizar milissegundos e o fuso horário do usuário, use o seguinte:
fonte
Apenas outra abordagem
Felicidades!
fonte
new Date().getTimezoneOffset()
deve ser alterada paranew Date(timestampStr).getTimezoneOffset()
Tenho a suspeita de que a Resposta não dá o resultado correto. Na pergunta, o autor da pergunta deseja converter a data e hora do servidor para a hora atual no Hellsinki, desconsiderando o fuso horário atual do usuário.
É o fato de que o fuso horário do usuário pode ser qualquer, então não podemos confiar nele.
Se, por exemplo, timestamp é 1270544790922 e temos uma função:
Quando um nova-iorquino visita a página, o alerta (_helsenkiTime) imprime:
E quando um Finlandês visita a página, o alerta (_helsenkiTime) imprime:
Portanto, a função está correta apenas se o visitante da página tiver o fuso horário de destino (Europa / Helsinque) em seu computador, mas falhar em quase todas as outras partes do mundo. E como o carimbo de data / hora do servidor geralmente é o carimbo de data / hora UNIX, que é, por definição, em UTC, o número de segundos desde a época do Unix (1 de janeiro de 1970 00:00:00 GMT), não podemos determinar DST ou não DST a partir do carimbo de data / hora.
Portanto, a solução é DISREGARD o fuso horário atual do usuário e implementar alguma forma de calcular o deslocamento UTC, esteja a data em DST ou não. O Javascript não tem um método nativo para determinar o histórico de transição do horário de verão de outro fuso horário diferente do atual do usuário. Podemos fazer isso da forma mais simples usando o script do lado do servidor, porque temos fácil acesso ao banco de dados de fuso horário do servidor com todo o histórico de transição de todos os fusos horários.
Mas se você não tiver acesso ao banco de dados de fuso horário do servidor (ou de qualquer outro servidor) E o carimbo de data / hora estiver em UTC, você pode obter a funcionalidade semelhante codificando as regras de DST em Javascript.
Para cobrir as datas nos anos de 1998 a 2099 na Europa / Helsinque, você pode usar a seguinte função ( jsfiddled ):
Exemplos de uso:
E isso imprime o seguinte, independentemente do fuso horário do usuário:
Obviamente, se você puder retornar o carimbo de data / hora em uma forma em que o deslocamento (DST ou não DST) já foi adicionado ao carimbo de data / hora no servidor, você não precisa calculá-lo no cliente e pode simplificar muito a função. MAS lembre-se de NÃO usar timezoneOffset (), porque então você terá que lidar com o fuso horário do usuário e este não é o comportamento desejado.
fonte
Presumindo que você obtenha o carimbo de data / hora no horário de Helsinque, eu criaria um objeto de data definido para meia-noite de 1 ° de janeiro de 1970 UTC (para desconsiderar as configurações de fuso horário local do navegador). Em seguida, basta adicionar o número necessário de milissegundos a ele.
Cuidado depois, para sempre pedir valores UTC do objeto de data. Dessa forma, os usuários verão os mesmos valores de data, independentemente das configurações locais. Caso contrário, os valores de data serão alterados de acordo com as configurações de hora local.
fonte
Você poderia usar
setUTCMilliseconds()
fonte
setUTCMilliseconds()
método define os milissegundos para uma data especificada de acordo com a hora universal. [...] Se um parâmetro que você especifica está fora do intervalo esperado,setUTCMilliseconds()
tenta atualizar as informações de data no objeto Date de acordo. Em outras palavras, você cria umDate
objeto com o carimbo de data / hora Unix fornecido, em UTC.