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
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
undtoISOString
.
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.
Hilfreichster Kommentar
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 jedeDate
Instanz nur diesen einen Wert und alle anderen Darstellungen davon werden basierend auf diesen Informationen plus Gebietsschema/Systemstatus (z. B. Zeitzonenversatz) induziert.#
Dies sind Methoden des
Date
Prototyps (Quelle: MDN ), nicht derDate
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 alleDate
Objekte auf demselben System denselben Wert fürgetTimezoneOffset()
, zB: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 resultierendeDate
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, wasUTC
.#
Wie oben erklärt, verwendet es
toISOString()
, was den Datumswert in UTC ausdrückt (also am EndeZ
anhängen, um dies anzuzeigen). Die zurückgegebene Zeichenfolge enthält keine Zeitzoneninformationen.#
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
undJSON
) miteinander.