Angular.js: $http ändert das Datum im POSTED JSON-Objekt (entfernt die Zeitzone oder den saisonalen Offset)

Erstellt am 25. Apr. 2016  ·  3Kommentare  ·  Quelle: angular/angular.js

Ich denke, das ist ein Bug.

Wie ist das aktuelle Verhalten?

Aktuell habe ich ein schönes Date-Objekt welches sich abmeldet

Fr 29.04.2016 13:33:00 GMT+0100 (BST)

Wenn dieses Objekt dann über $http gepostet wird, wird bei den Netzwerkanfragen folgendes beachtet.

2016-04-28T12:33:00.000Z

Das $http-Objekt subtrahiert also eine Stunde und entfernt effektiv die britische Sommerzeit BST aus der Zeit. Dies wird also ohne diesen Offset in der Datenbank gespeichert. Wenn wir dieses Datum sofort lesen, kommt es zurück, aber wie kann das System wissen, dass wir die Stunde zurückzählen müssen?

Stellen Sie sich also auch vor, dass sich der Benutzer in einer anderen Zeitzone befindet. Sagen Sie, 5 Stunden voraus, dann zieht das System 5 Stunden ab... Die Zeit hängt vom Kontext ab, in dem sie erstellt wird. mit anderen Worten, die Zeitzoneninformationen sollten nicht entfernt werden.

Ich sehe das in Chrome. Winkel 1.4.2

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

Hilfreichster Kommentar

Zuerst denke ich, dass es nicht richtig ist, zu sagen, dass das Datumsobjekt keine Zeitzoneninformationen hat.

Ich denke immer noch, dass es richtig ist zu sagen, dass :grin: Ein Date Objekt _"einen einzelnen Zeitpunkt darstellt [...] basierend auf einem Zeitwert, der die Anzahl der Millisekunden seit dem 1. Januar 1970 UTC ist" _ (Quelle: MDN ). Im Grunde kennt also jede Date Instanz nur diesen einen Wert und alle anderen Darstellungen davon werden basierend auf diesen Informationen plus Gebietsschema/Systemstatus (z. B. Zeitzonenversatz) induziert.

#

Ein Date-Objekt hat die Methoden getTimezoneOffset und toISOString .

Dies sind Methoden des Date Prototyps (Quelle: MDN ), nicht der Date Objekte (auch bekannt als Instanzen) selbst.

Genauer gesagt hängt der Wert von getTimezoneOffset() vom aktuellen Gebietsschema (Hostsystemeinstellungen) ab. Dies ist der Grund, warum es keine äquivalente setTimezoneOffset() Methode gibt und alle Date Objekte auf demselben System denselben Wert für getTimezoneOffset() , zB:

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

Die Zeitzoneninformationen, die in einer an Date Datumszeichenfolgendarstellung angegeben sind, werden also nur verwendet, um diese Zeichenfolge zu analysieren und sie wie oben beschrieben einem bestimmten Zeitpunkt zuzuordnen. Das resultierende Date Objekt weiß nichts über Zeitzonen :smiley:

Die Methode toISOString() gibt keine Zeitzoneninformationen aus, wie Sie vorgeschlagen haben. Es fügt nur Z am Ende hinzu, was UTC .

#

Zweitens entfernt JSON.stringify() auch nicht den Zonenwert

Wie oben erklärt, verwendet es toISOString() , was den Datumswert in UTC ausdrückt (also am Ende Z anhängen, um dies anzuzeigen). Die zurückgegebene Zeichenfolge enthält keine Zeitzoneninformationen.

#

Ich glaube immer noch, dass, wenn die API ein ISO-Datum rendert, das diesen Millisekundenwert nicht hat und die Benutzeroberfläche einen Datumswähler verwendet, der nur ein Datum auswählt und das Datum ändert, wenn Angular beim Zurücksenden des Datums in das ISO-Format keine Millisekunden hat Wert.

Ich habe keine Ahnung, was Millisekunden damit zu tun haben. Wir sprachen über Zeitzoneninformationen.

Auch dies hat nichts mit AngularJS zu tun. Auf diese Weise interagieren die integrierten Objekte (wie Date und JSON ) miteinander.

Alle 3 Kommentare

Dies ist nichts Angular-spezifisches. Es ist das Standardverhalten von JSON.stringify .

Grundsätzlich konvertiert $http Daten beim Posten in JSON (über JSON.stringify() ). In JavaScript ist die JSON-Darstellung eines Date-Objekts seine ISO-8601-Form (die Sie auf der Registerkarte "Netzwerk" sehen).

Ein Date-Objekt hat sowieso keine Zeitzoneninformationen, daher werden keine Informationen entfernt. Das aktuelle Gebietsschema (das völlig unabhängig von dem Datum ist, das durch Date-Objekte dargestellt wird) hat einen Zeitzonen-Offset und der Browser formatiert das Datum entsprechend diesem Offset, wenn console.log es verwendet.

Schließen, da dies bei Angular kein Problem ist.

@gkalpak Zuerst denke ich, dass es nicht richtig ist zu sagen, dass das getTimezoneOffset und toISOString . Wenn diese Methoden aufgerufen werden, geben sie den Zonenwert zurück, es ist nichts, was der Browser für uns druckt, es sind tatsächliche Werte im Date-Objekt.

new Date().getTimezoneOffset()
-330

new Date().toISOString()
"2018-12-04T05:40:37.399Z"

Zweitens entfernt JSON.stringify() auch den Zonenwert nicht. Folgendes haben wir in der Browserkonsole gesehen und es ist dasselbe, der Browser druckt nichts Schönes für uns.

JSON.stringify({d:new Date()})
"{"d":"2018-12-04T05:42:08.973Z"}"

Ich glaube immer noch, dass, wenn die API ein ISO-Datum rendert, das diesen Millisekundenwert nicht hat und die Benutzeroberfläche einen Datumswähler verwendet, der nur ein Datum auswählt und das Datum ändert, wenn Angular beim Zurücksenden des Datums in das ISO-Format keine Millisekunden hat Wert.

Zuerst denke ich, dass es nicht richtig ist, zu sagen, dass das Datumsobjekt keine Zeitzoneninformationen hat.

Ich denke immer noch, dass es richtig ist zu sagen, dass :grin: Ein Date Objekt _"einen einzelnen Zeitpunkt darstellt [...] basierend auf einem Zeitwert, der die Anzahl der Millisekunden seit dem 1. Januar 1970 UTC ist" _ (Quelle: MDN ). Im Grunde kennt also jede Date Instanz nur diesen einen Wert und alle anderen Darstellungen davon werden basierend auf diesen Informationen plus Gebietsschema/Systemstatus (z. B. Zeitzonenversatz) induziert.

#

Ein Date-Objekt hat die Methoden getTimezoneOffset und toISOString .

Dies sind Methoden des Date Prototyps (Quelle: MDN ), nicht der Date Objekte (auch bekannt als Instanzen) selbst.

Genauer gesagt hängt der Wert von getTimezoneOffset() vom aktuellen Gebietsschema (Hostsystemeinstellungen) ab. Dies ist der Grund, warum es keine äquivalente setTimezoneOffset() Methode gibt und alle Date Objekte auf demselben System denselben Wert für getTimezoneOffset() , zB:

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

Die Zeitzoneninformationen, die in einer an Date Datumszeichenfolgendarstellung angegeben sind, werden also nur verwendet, um diese Zeichenfolge zu analysieren und sie wie oben beschrieben einem bestimmten Zeitpunkt zuzuordnen. Das resultierende Date Objekt weiß nichts über Zeitzonen :smiley:

Die Methode toISOString() gibt keine Zeitzoneninformationen aus, wie Sie vorgeschlagen haben. Es fügt nur Z am Ende hinzu, was UTC .

#

Zweitens entfernt JSON.stringify() auch nicht den Zonenwert

Wie oben erklärt, verwendet es toISOString() , was den Datumswert in UTC ausdrückt (also am Ende Z anhängen, um dies anzuzeigen). Die zurückgegebene Zeichenfolge enthält keine Zeitzoneninformationen.

#

Ich glaube immer noch, dass, wenn die API ein ISO-Datum rendert, das diesen Millisekundenwert nicht hat und die Benutzeroberfläche einen Datumswähler verwendet, der nur ein Datum auswählt und das Datum ändert, wenn Angular beim Zurücksenden des Datums in das ISO-Format keine Millisekunden hat Wert.

Ich habe keine Ahnung, was Millisekunden damit zu tun haben. Wir sprachen über Zeitzoneninformationen.

Auch dies hat nichts mit AngularJS zu tun. Auf diese Weise interagieren die integrierten Objekte (wie Date und JSON ) miteinander.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen

Verwandte Themen

brijesh1ec picture brijesh1ec  ·  3Kommentare

tdumitrescu picture tdumitrescu  ·  3Kommentare

ceymard picture ceymard  ·  3Kommentare

awerlang picture awerlang  ·  3Kommentare

jtorbicki picture jtorbicki  ·  3Kommentare