Eu penso que isto é um erro.
Qual é o comportamento atual?
Atualmente, tenho um bom objeto de data que efetua logout no
Sexta, 29 de abril de 2016 13:33:00 GMT + 0100 (BST)
Quando este objeto é então POSTADO via $ http, o seguinte é observado nas solicitações de rede.
28-04-2016T12: 33: 00.000Z
Portanto, o objeto $ http subtrai uma hora e remove efetivamente o horário de verão britânico BST da hora. Portanto, isso é armazenado no banco de dados sem esse deslocamento. Quando lemos imediatamente esta data, ela volta, mas como o sistema pode saber que precisamos adicionar a hora de volta?
Então imagine também que o usuário está em outro fuso horário..diga 5 horas à frente então o sistema irá subtrair 5 horas ... O tempo é sensível ao contexto em que é criado. em outras palavras, as informações de fuso horário não devem ser removidas.
Estou vendo isso no Chrome. Angular 1.4.2
Isso não é algo específico do Angular. É o comportamento padrão de JSON.stringify
.
Basicamente, ao postar dados, $http
converte em JSON (via JSON.stringify()
). Em JavaScript, a representação JSON de um objeto Date é sua forma ISO-8601 (que é o que você vê na guia rede).
Um objeto Date não tem informações de fuso horário de qualquer maneira, portanto, não há informações removidas. O local atual (que é totalmente independente da data representada pelos objetos Date) tem um deslocamento de fuso horário e o navegador formata a data de acordo com esse deslocamento quando console.log
ging.
Fechar, pois isso não é um problema com o Angular.
@gkalpak Primeiro, acho que não é correto dizer que o objeto Date não tem informações de fuso horário. Quando criamos uma data por novo Date (), as informações de fuso horário são o fuso local por padrão. Um objeto Date tem os métodos getTimezoneOffset
e toISOString
. Quando chamados, esses métodos retornam o valor da zona, não é nada que o navegador esteja imprimindo bem para nós, eles são valores reais no objeto Date.
new Date().getTimezoneOffset()
-330
new Date().toISOString()
"2018-12-04T05:40:37.399Z"
Em segundo lugar, JSON.stringify()
também não remove o valor da zona, o que se segue é o que vimos no console do navegador e é o mesmo, o navegador não está imprimindo nada de bom para nós.
JSON.stringify({d:new Date()})
"{"d":"2018-12-04T05:42:08.973Z"}"
Então, eu ainda acredito que se a API renderizar uma data ISO que não tenha esses valores de milissegundos e a IU estiver usando algum selecionador de data que só escolhe uma data e muda a data, o Angular ao enviar a data de volta convertendo para o formato ISO não terá milissegundos valor.
Em primeiro lugar, acho que não é correto dizer que o objeto Date não tem informações de fuso horário.
Ainda acho que é correto dizer que: sorriso: A Date
object _ "representa um único momento no tempo [...] com base em um valor de tempo que é o número de milissegundos desde 1º de janeiro de 1970 UTC" _ (fonte: MDN ). Portanto, basicamente cada instância Date
conhece apenas esse valor e todas as outras representações dele são induzidas com base nessa informação mais local / estado do sistema (como deslocamento de fuso horário).
Um objeto Date tem os métodos
getTimezoneOffset
etoISOString
.
Esses são métodos no protótipo Date
(fonte: MDN ), não dos próprios Date
objetos (também conhecidos como instâncias).
Mais especificamente, o valor de getTimezoneOffset () depende da localidade atual (configurações do sistema host). Esta é a razão pela qual não há método setTimezoneOffset()
equivalente e porque todos os objetos Date
no mesmo sistema retornam o mesmo valor para getTimezoneOffset()
, por exemplo:
const d1 = new Date('December 15, 2018 12:34:56'); // No timezone; uses the current system locale.
const d2 = new Date('December 15, 2018 12:34:56 GMT+10'); // Uses GTM+10 as timezone.
d1.getTimezoneOffset() === d2.getTimezoneOffset(); // true
Portanto, a informação de fuso horário especificada em uma representação de string de data passada para Date
é usada apenas para analisar essa string e mapeá-la para um momento específico no tempo, conforme descrito acima. O objeto Date
resultante não sabe nada sobre fusos horários: smiley:
O método toISOString () não imprime informações de fuso horário como você sugeriu. Ele apenas adiciona Z
no final, o que denota UTC
.
Em segundo lugar,
JSON.stringify()
também não remove o valor da zona
Conforme explicado acima, ele usa toISOString()
, que expressa o valor da data em UTC (acrescentando Z
no final para indicar isso). Não há informações de fuso horário na string retornada.
Então, eu ainda acredito que se a API renderizar uma data ISO que não tenha esses valores de milissegundos e a IU estiver usando algum selecionador de data que só escolhe uma data e muda a data, o Angular ao enviar a data de volta convertendo para o formato ISO não terá milissegundos valor.
Não tenho ideia do que milissegundos têm a ver com isso. Estávamos falando sobre informações de fuso horário.
Novamente, isso não tem nada a ver com o AngularJS. É assim que os objetos embutidos (como Date
e JSON
) interagem uns com os outros.
Comentários muito úteis
Ainda acho que é correto dizer que: sorriso: A
Date
object _ "representa um único momento no tempo [...] com base em um valor de tempo que é o número de milissegundos desde 1º de janeiro de 1970 UTC" _ (fonte: MDN ). Portanto, basicamente cada instânciaDate
conhece apenas esse valor e todas as outras representações dele são induzidas com base nessa informação mais local / estado do sistema (como deslocamento de fuso horário).#
Esses são métodos no protótipo
Date
(fonte: MDN ), não dos própriosDate
objetos (também conhecidos como instâncias).Mais especificamente, o valor de getTimezoneOffset () depende da localidade atual (configurações do sistema host). Esta é a razão pela qual não há método
setTimezoneOffset()
equivalente e porque todos os objetosDate
no mesmo sistema retornam o mesmo valor paragetTimezoneOffset()
, por exemplo:Portanto, a informação de fuso horário especificada em uma representação de string de data passada para
Date
é usada apenas para analisar essa string e mapeá-la para um momento específico no tempo, conforme descrito acima. O objetoDate
resultante não sabe nada sobre fusos horários: smiley:O método toISOString () não imprime informações de fuso horário como você sugeriu. Ele apenas adiciona
Z
no final, o que denotaUTC
.#
Conforme explicado acima, ele usa
toISOString()
, que expressa o valor da data em UTC (acrescentandoZ
no final para indicar isso). Não há informações de fuso horário na string retornada.#
Não tenho ideia do que milissegundos têm a ver com isso. Estávamos falando sobre informações de fuso horário.
Novamente, isso não tem nada a ver com o AngularJS. É assim que os objetos embutidos (como
Date
eJSON
) interagem uns com os outros.