Eu tenho uma página da web com três listas suspensas por dia, mês e ano. Se eu usar o Date
construtor JavaScript que recebe números, recebo um Date
objeto para o meu fuso horário atual:
new Date(xiYear, xiMonth, xiDate)
Forneça a data correta, mas acredita que a data é GMT + 01: 00 devido ao horário de verão.
O problema aqui é que, em seguida, passo isso Date
para um método Ajax e, quando a data é desserializada no servidor, ela é convertida em GMT e, portanto, perdemos uma hora que faz o dia voltar um dia. Agora eu poderia passar o dia, mês e ano individualmente para o método Ajax, mas parece que deveria haver uma maneira melhor.
A resposta aceita me apontou na direção certa, porém apenas o uso setUTCHours()
por si só mudou:
Apr 5th 00:00 GMT+01:00
para
Apr 4th 23:00 GMT+01:00
Eu também tive que definir a data UTC, mês e ano para terminar com
Apr 5th 01:00 GMT+01:00
o que eu queria.
fonte
Respostas:
Com
.setUTCHours()
isso, seria possível definir datas no horário UTC, o que permitiria o uso do horário UTC em todo o sistema.Você não pode configurá-lo usando UTC no construtor, a menos que especifique uma sequência de datas.Usando
new Date(Date.UTC(year, month, day, hour, minute, second))
você pode criar um objeto Date a partir de uma hora UTC específica.fonte
Esta resposta é adaptada especificamente à pergunta original e não fornecerá a resposta que você necessariamente espera. Em particular, algumas pessoas desejam subtrair o deslocamento do fuso horário em vez de adicioná-lo. Lembre-se, porém, que o objetivo principal desta solução é hackear o objeto de data do javascript para uma desserialização específica, para não estar correto em todos os casos.
fonte
*60*1000
é mais claro nesse caso; em outras palavras, é bastante evidente por que está lá.Acredito que você precise da função createDateAsUTC (compare com convertDateToUTC )
fonte
date
no fuso horário UTC, mas o segundo parece não estar fazendo nada de útil? (retorna mesma datadate
)Date
objeto JavaScript sempre refletirá a época unix baseada em UTC e o fuso horário local . O sintoma é aparente quando você chamatoString
o objeto de data resultante e ainda vê o fuso horário local, mesmo que você esperasse que ele estivesse no UTC.Date
objeto JavaScript . Outra maneira de ver isso aqui é queDate.UTC
espera valores baseados em UTC, e você os está alimentando com valores de hora local e vice-versa com oDate
construtor.Basta definir o fuso horário e voltar de acordo
fonte
Não acredito que isso seja possível - não há capacidade de definir o fuso horário em um objeto Date depois que ele é criado.
E de certa forma isso faz sentido - conceitualmente (se não estiver em implementação); conforme http://en.wikipedia.org/wiki/Unix_timestamp (ênfase minha):
Depois de construir um, ele representará um certo ponto no tempo "real". O fuso horário é relevante apenas quando você deseja converter esse ponto de tempo abstrato em uma sequência legível por humanos.
Portanto, faz sentido que você só possa alterar a hora real que a Data representa no construtor. Infelizmente, parece que não há como passar um fuso horário explícito - e o construtor que você está chamando (sem dúvida corretamente) converte suas variáveis de hora "locais" em GMT quando as armazena canonicamente - portanto, não há como usar o
int, int, int
construtor para Horários GMT.No lado positivo, é trivial usar apenas o construtor que usa uma String. Você nem precisa converter o mês numérico em uma String (pelo menos no Firefox), então eu esperava que uma implementação ingênua funcionasse. No entanto, depois de testá-lo, ele funciona com êxito no Firefox, Chrome e Opera, mas falha no Konqueror ("Data Inválida"), Safari ("Data Inválida") e IE ("NaN"). Suponho que você tenha apenas uma matriz de pesquisa para converter o mês em uma string, assim:
fonte
Eu sei que isso é antigo, mas se ajudar, você pode usar o momento e o fuso horário do momento. Se você não os viu, dê uma olhada.
http://momentjs.com/timezone/
http://momentjs.com/
duas bibliotecas de manipulação de tempo realmente úteis.
fonte
Se você deseja lidar com o problema ligeiramente diferente, mas relacionado, de criar um objeto Data Javascript a partir de ano, mês, dia, ..., incluindo fuso horário - ou seja, se você deseja analisar uma sequência em uma Data -, então você aparentemente tem que fazer uma dança irritantemente complicada:
Ou seja, você cria uma 'hora UTC' usando a data sem fuso horário (para saber em que localidade está, ou seja, a 'localidade' UTC e não é o padrão para a local) e, em seguida, aplica manualmente o deslocamento de fuso horário indicado.
Não seria bom se alguém tivesse realmente pensado no objeto de data Javascript por mais de, oooh, cinco minutos ....
fonte
para todos os desvios de localização Wiki List of offsets time UTC
fonte
getTimeZoneOffset é menos para UTC + z.
fonte
Isso pode ajudar alguém, coloque o UTC no final do que você passa para o novo construtor
Pelo menos no chrome você pode dizer
var date = new Date("2014-01-01 11:00:00 UTC")
fonte
+0000
( observe que o espaço entre 00 e UTC precisa ser removido) e isso funcionará no Firefox e no Chrome. No entanto, não tenho certeza para o Safari. (Referência: stackoverflow.com/a/17545854/1273587 )Solução de uma linha
Em vez de 1422524805305, use o registro de data e hora em milissegundos. Em vez de 330, use o deslocamento do fuso horário em minutos. GMT (por exemplo, Índia + 5: 30 é 5 * 60 + 30 = 330 minutos)
fonte
fonte
A maneira mais fácil que encontrei para obter a data correta é usando o datejs.
http://www.datejs.com/
Recebo minhas datas via Ajax neste formato como uma sequência: '2016-01-12T00: 00: 00'
O console lerá:
Seg 11 de janeiro de 2016 19:00:00 GMT-0500 (Horário padrão do leste)
Terça-feira, 12 de janeiro de 2016 00:00:00 GMT-0500 (horário padrão oriental)
https://jsfiddle.net/vp1ena7b/3/
O 'addMinutes' vem do datejs, você provavelmente poderia fazer isso em js puros sozinho, mas eu já tinha o datejs no meu projeto, então encontrei uma maneira de usá-lo para obter as datas corretas.
Eu pensei que isso poderia ajudar alguém ...
fonte
qualquer quilometragem em
fonte
Este código retornará seu objeto Date formatado com o fuso horário do navegador .
Editar:
Para evitar poluir a API de data, a função acima pode ser transformada em uma função de utilitário. A função pega um objeto Date e retorna um objeto Date mutado.
fonte
A melhor solução que eu vi disso veio de
http://www.codingforums.com/archive/index.php/t-19663.html
Função Print Time
Exemplo de código completo
fonte
se você quiser verificar a diferença entre duas datas, basta verificar se o segundo fuso horário é menor ou maior do primeiro fuso horário desejado e subtrair ou adicionar um horário.
fonte
GMT -03: 00 Exemplo
Ou até
fonte
Isso funcionou para mim. Não tenho certeza se é uma boa idéia.
fonte
Eu usei o pacote timezone-js.
fonte
Esta é a melhor solução
Usando:
Código:
Versão do café:
fonte