Wie wird der AngularStrap Datepicker-Wert ohne Zeitzone gesendet?
Frage ich mich, ob es möglich ist, verwenden Sie AngularStrap den datepicker ohne es zu halten für das Gebietsschema des Benutzers Zeitzone Informationen. In unserer Anwendung, die wir behandeln möchten, Vertrag von Objekten, die ein Verfallsdatum aufweisen.
Beim hinzufügen oder Bearbeiten der Vertragsgegenstand, es ist ein datepicker-Feld für die Auswahl des Datums. Die folgende Sache passiert:
- Wählt der Benutzer das Datum (z.B. 2013-10-24)
- Eckige bindet die javascript-date-Objekt, auf das ng-Modell-Feld
- Die gebundenen date-Objekt ist in der Benutzer-Zeitzone (z.B. GMT+3)
- Der Benutzer das Formular sendet
- Das Datum wird an den server gesendet, mit Eckig $http-service
In Schritt 5 wird das Datum umgewandelt zu UTC-format. Das gewählte Datum war GMT+3 2013-10-24 Mitternacht, sondern die UTC-Konvertierung ändert das Datum zu 2013-10-23 um 9pm.
Wie können wir verhindern, dass die conversion, oder verwenden Sie UTC-Termine während des gesamten Prozesses? Wir wollen nicht der Vertrag das Datum zu ändern, basierend auf Ihrer lokalen Zeitzone. Wir wollen stattdessen das Datum immer 2013-10-24, egal welche Zeitzone.
Unsere aktuelle Lösung war, um kleine änderungen vornehmen, um die AngularStrap Bibliothek, so dass das Datum nicht ändern, wenn an den server gesendet.
Wenn wir bekommen konnten vom user gewählte Zeitzone auf dem server, könnten wir eine weitere Umstellung gibt, aber der server nicht über diese Informationen verfügen.
Alle Ideen sind willkommen!
InformationsquelleAutor der Frage Janne | 2013-10-24
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ist nicht das Problem AngularStrap. Seine nur, wie javascript-Daten arbeiten, und wie JSON-Formate, die Sie für die übertragung. Wenn Sie wiederum ein javascript-date-Objekt in einen JSON-string, formatiert den string als UTC.
Zum Beispiel, ich bin in Utah und es ist jetzt 07:41 2013-10-24. Wenn ich eine neue javascript-Datum und drucken Sie es auf der Konsole wird es sagen:
Wenn ich stringify selben Datum (mit
JSON.stringify(date)
ich bekommen:dem Sie sehen können, ist nicht in meiner aktuellen Zeitzone, aber in UTC. Also die Umwandlung geschieht nur, bevor das Formular wird an den server gesendet, wenn er in einem javascript-Objekt zu einem JSON-string.
Der einfachste Weg, es zu tun wäre, nur ändern Sie das Datum in eine Zeichenfolge Ihrer Wahl vor dem Versand das Datum auf dem server. Also anstatt JSON ändern Sie das Datum, UTC, (vorausgesetzt, Sie kümmern sich nicht um die Uhrzeit) könnte man nur so etwas tun:
Werden, die Ihnen die UTC-basierte Zeichenfolge, die aussieht wie
'2013-10-24'
und dann schicken Sie, dass auf dem server, anstelle des JSON-format, die mit der Zeit info. Hoffentlich das hilft.UPDATE: Wie @Matt Johnson sagte, es gibt zwei Möglichkeiten, es zu tun. Sie sagte:
How could we prevent the conversion, or use UTC dates during the whole process?
. Wenn Sie möchten, verwenden Sie UTC, dann mit meiner obigen Erklärung. Wenn Sie wollen einfach nur "verhindern, dass die Konvertierung", könnten Sie Folgendes verwenden:InformationsquelleAutor der Antwort tennisgent
Etwas spät, aber ich verbrachte meinen Nachmittag auf diese und jemand Sie nützlich finden könnten.
Einen anderen Weg, dies zu tun deklarativ ist die Verwendung der dateType, dateFormat und modelDateFormat Attribute. Legen Sie diese entweder in der config oder HTML-e.g
DateFormat wird das format das Datum angezeigt wird und der Benutzer in der Datumsauswahl während modelDateFormat ist das format umgewandelt werden, bevor Sie an Ihrem Modell.
Hatte ich auch default-Werte, die vom server kommt, die ich brauchte, um gebunden werden zu den datepicker auf die Seite laden. Deshalb musste ich das format aktualisieren der server serialisierte Daten im JSON-entsprechend der modelDateFormat. Ich bin mit Web-API-so habe ich das unten.
InformationsquelleAutor der Antwort Bradley MIller
Den "Winkel-Weg" ist die Verwendung der $filter service zur Formatierung des Datums zurück, datepicker.
Beispiel (HTML):
Beispiel (JS):
Plunker hier
InformationsquelleAutor der Antwort WeNeigh