Meus objetos de data em JavaScript são sempre representados por UTC + 2 por causa de onde estou localizado. Portanto, assim
Mon Sep 28 10:00:00 UTC+0200 2009
O problema é JSON.stringify
converter a data acima para
2009-09-28T08:00:00Z (notice 2 hours missing i.e. 8 instead of 10)
O que eu preciso é que a data e a hora sejam respeitadas, mas não são, portanto, deveria ser
2009-09-28T10:00:00Z (this is how it should be)
Basicamente, eu uso isso:
var jsonData = JSON.stringify(jsonObject);
Tentei passar um parâmetro de substituição (segundo parâmetro em stringify), mas o problema é que o valor já foi processado.
Eu também tentei usar toString()
e toUTCString()
no objeto de data, mas eles também não me deram o que eu quero ..
Alguém pode me ajudar?
javascript
json
datetime
utc
Mark Smith
fonte
fonte
2009-09-28T10:00:00Z
não representa o mesmo momento no tempo queMon Sep 28 10:00:00 UTC+0200 2009
. EmZ
uma data ISO 8601 significa UTC, e 10 horas em UTC é um momento diferente de 10 horas em +0200. Uma coisa seria querer que a data fosse serializada com o fuso horário correto, mas você está nos pedindo para ajudá-lo a serializá-la para uma representação que seja inequívoca e objetivamente errada .Respostas:
Recentemente, tive o mesmo problema. E foi resolvido com o seguinte código:
fonte
JSON usa a
Date.prototype.toISOString
função que não representa a hora local - ela representa a hora em UTC não modificado - se você olhar sua saída de data, verá que está em UTC + 2 horas, razão pela qual a string JSON muda em duas horas, mas se isso permitir que o mesmo tempo seja representado corretamente em vários fusos horários.fonte
Apenas para registro, lembre-se de que o último "Z" em "2009-09-28T08: 00: 00Z" significa que a hora está realmente em UTC.
Consulte http://en.wikipedia.org/wiki/ISO_8601 para obter detalhes.
fonte
Aqui está outra resposta (e pessoalmente acho que é mais apropriada)
fonte
date.toJSON () imprime a data UTC em uma string formatada (então adiciona o deslocamento com ela ao convertê-la para o formato JSON).
fonte
date.getTime()
retorna o tempo em milissegundos, então devemos converter o segundo operando para milissegundos também. Como osdate.getTimezoneOffset()
retornos são deslocados em minutos, nós o multiplicamos por 60.000, porque 1 minuto = 60.000 milissegundos. Então, subtraindo o deslocamento da hora atual, obtemos a hora em UTC.você pode usar o moment.js para formatar com a hora local:
fonte
Estou um pouco atrasado, mas você sempre pode sobrescrever a função toJson no caso de um Date usando Prototype como:
No meu caso, Util.getDateTimeString (this) retorna uma string como esta: "2017-01-19T00: 00: 00Z"
fonte
Normalmente, você deseja que as datas sejam apresentadas a cada usuário em seu próprio horário local-
é por isso que usamos GMT (UTC).
Use Date.parse (jsondatestring) para obter a string de hora local,
a menos que você queira que seu horário local seja mostrado a cada visitante.
Nesse caso, use o método de Anatoly.
fonte
Contorne esse problema usando a
moment.js
biblioteca (a versão sem fuso horário).Eu estava usando a
flatpickr.min.js
biblioteca. A hora do objeto JSON resultante criado corresponde à hora local fornecida, mas ao selecionador de data.fonte
Solução
JSON.stringify
pronta para usar para forçar a ignorar fusos horários:Usando a biblioteca moment.js:
fonte
Eu me deparei com isso trabalhando com coisas legadas onde eles só funcionam na costa leste dos Estados Unidos e não armazenam datas no UTC, é tudo EST. Tenho que filtrar as datas com base na entrada do usuário no navegador, portanto, devo passar a data na hora local no formato JSON.
Só para elaborar essa solução já postada - é o que eu uso:
Portanto, meu entendimento é que isso irá em frente e subtrairá o tempo (em milissegundos (portanto, 60.000) da data de início com base no deslocamento de fuso horário (retorna minutos) - em antecipação à adição de tempo para que JSON () será adicionado.
fonte
Aqui está algo realmente legal e simples (pelo menos eu acredito que sim :)) e não requer manipulação de data para ser clonado ou sobrecarregando qualquer uma das funções nativas do navegador, como toJSON (referência: Como criar uma string JSON em uma data javascript e preservar o fuso horário , Courty Shawson)
Passe uma função substituta para JSON.stringify que restringe as coisas de acordo com sua vontade !!! Desta forma, você não precisa fazer diferenças de horas e minutos ou qualquer outra manipulação.
Coloquei console.logs para ver os resultados intermediários, para que fique claro o que está acontecendo e como a recursão está funcionando. Isso revela algo digno de nota: o valor param para substituir já está convertido para o formato de data ISO :). Use esta [tecla] para trabalhar com dados originais.
fonte
JavaScript normalmente converte o fuso horário local em UTC.
fonte
Tudo se resume a se o back-end do servidor é independente do fuso horário ou não. Se não for, você precisa assumir que o fuso horário do servidor é o mesmo que o do cliente ou transferir informações sobre o fuso horário do cliente e incluí-lo nos cálculos.
um exemplo de back-end PostgreSQL:
O último é provavelmente o que você deseja usar no banco de dados, se não estiver disposto a implementar a lógica de fuso horário adequadamente.
fonte
Em vez de
toJSON
, você pode usar a função de formato que sempre dá a data e hora corretas +GMT
fonte
Eu tentei isso no angular 8:
criar modelo:
em seu componente
enviar Data para sua API para salvar
Ao carregar seus dados da API, você fará o seguinte:
model.YourDate = new Date(model.YourDate+"Z");
você obterá sua data corretamente com seu fuso horário.
fonte