2016-03-01 3 views
7

Ich benutze den Datepicker, um ein Datum auszuwählen und es an den Server zu senden.Falsches Datum mit der Datumsauswahl des eckigen Materials

Wenn ich die JS Wert einzuloggen bekomme ich das richtige Ergebnis:

Tue Mar 22 2016 00:00:00 GMT+0100 (Mitteleuropäische Zeit) 

aber in der Ajax-Anfrage ist es

2016-03-21T23:00:00.000Z 

ich nicht ändern die Werte, nur das Objekt geben zu Angulars http-Funktion.

Benötigt Angular eine Konfiguration, um damit umgehen zu können?

+0

Ich fand das Hinzufügen von ng-model-options = "{timezone: 'utc'}" zum md-date-picker, um eine gute Lösung zu sein. – Brendan

Antwort

3

Diese beiden Zeichenfolgen repräsentieren die gleiche Zeit. Einer ist in UTC, d.h. GMT + 0, was man aus der Z Endung sehen kann. Der andere ist in einer anderen Zeitzone, speziell GMT +1 Stunde.

Wenn Sie JavaScript-Datumsobjekte für beide Zeichenfolgen hatten und sie in Ganzzahlen umwandelten, d. H. Sekunden, die seit dem 1. Januar 1970 (UTC) vergangen waren, waren sie identisch. Sie repräsentieren die gleiche sofortige aber in zwei verschiedenen geografischen Standorten.

var d1 = new Date('Tue Mar 22 2016 00:00:00 GMT+0100'); 
var d2 = new Date('2016-03-21T23:00:00.000Z'); 

Number(d1); // 1458601200000 
Number(d2); // 1458601200000 

Im Allgemeinen ist dies eine gute Sache. Der Umgang mit Zeitzonen wird sehr verwirrend. Ich finde es am besten für einen Server, immer in UTC zu handeln.

+0

Aber wie kann ich das Format gmt + 1 an den Server senden? – mimo

+1

Ich schlage vor, dass Sie es nicht versuchen. Der Server kann UTC speichern und dann UTC zurück an den Browser senden. Javascript kann aus der UTC-Zeit ein "Date" -Objekt konstruieren, und es wird dem Benutzer standardmäßig eine lokalisierte Zeitzone angezeigt, ohne dass Sie etwas tun müssen. Wenn Sie den zeitzonenspezifischen Wert auf dem Server _really_ speichern müssen, können Sie den Wert als String festlegen, bevor Sie ihn durch Aufruf der '.toString()' Methode senden. – Chris

3

https://github.com/angular/material/pull/9410

Schauen Sie sich die 1.1.1+ Version. Dies wird Ihr Problem lösen.

<md-datepicker ng-model="date" ng-model-options="{ timezone: 'utc' }"></md-datepicker> 
+0

Ich möchte das gleiche in Winkel 2 (+) und Mat-Datepicker, Any Lösung? Danke im Voraus!! –

2

können Sie versuchen, das folgende Stück Code

date.setMinutes((date.getTimezoneOffset() * -1)); 

Keine Notwendigkeit der Lokalisierung, verwenden Sie diesen Code nur, bevor Sie Service-Aufruf zu tun. Es wird Ihnen das genaue Datum übergeben, das Sie im Datepicker ausgewählt haben.

sie in allen Zeitzone arbeiten (+) und (-),

Beispiel: 2016-03-21 00:00:00 GMT+0100, sagte der obige Code als 2016-03-21 01:00:00 GMT+0000 verdeckte. Während des Service wird es als 2016-03-21 00:00:00 konvertiert.

Ich denke, es wird Ihr Problem lösen.