Angular.js: $ http modifica a data no objeto POSTED JSON (remove o fuso horário ou deslocamento sazonal)

Criado em 25 abr. 2016  ·  3Comentários  ·  Fonte: angular/angular.js

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

Também http://stackoverflow.com/questions/24356475/angular-js-date-changes-when-submitting-to-http-timezone-issue

Comentários muito úteis

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 e toISOString .

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.

Todos 3 comentários

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 e toISOString .

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.

Esta página foi útil?
0 / 5 - 0 avaliações