2015-07-25 11 views
8

Auf Client-Seite verwende ich TT/MM/JJJJ-Datumsformat. Das Feld verwenden, um einen twitter Bootstrap 3 Datetime-Picker (https://eonasdan.github.io/bootstrap-datetimepicker/)verloren einen Tag für ein Datum

ich via Twitter Bootstrap 3 Datetime Picker eingeben 24/07/2015
in meinem json i gesendet, ich sehe: Geburtstag: "24/07/2015"

in meinem dto, ich tue

@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "dd/MM/yyyy") 
private Date birthdate; 

Wenn ich das Datum auf dem Server erhalten, in meinem dto siehe: 23/07/2015 19:00

Eines Tages verloren geht.

Jede Erklärung?

+0

Haben Sie Ihre lokalen Zeiteinstellungen auf Ihrem System überprüft? – Sam

+0

Client/Server ist auf der gleichen Maschine: beide ist edt -4 Stunden (mtl Zeit) ... –

+1

Es ist definitiv ein Zeitzone Übersetzungsproblem. Eine Seite behandelt die Zeit als UTC und die andere konvertiert zur Ortszeit. Dieses Problem trat bei einer Client/Server-Integration mit einem Drittanbietersystem auf. Das tote Werbegeschenk ist die "19:00", die zu der anderen Zeit hinzugefügt wurde, es sind genau 5 Stunden Unterschied (nicht wirklich ein ganzer Tag). – mellamokb

Antwort

7

Nach JacksonFAQDateHandling Seite:

Alle Zeitobjekte, die Time-Zone zugeordnet sind (java.util.Calendar usw.), die Jackson Verwendung die Standard-Zeitzone (GMT) konstruiert, nicht die lokalen Zeitzone (was auch immer das sein mag). Das heißt: Jackson verwendet standardmäßig GMT für die gesamte Verarbeitung , es sei denn speziell anders angegeben.

In Ihrem Fall sieht es so aus, als ob das Datum automatisch in GMT/UTC konvertiert wird. Versuchen Sie, Ihre lokale Zeitzone explizit anzugeben, um die UTC-Konvertierung zu vermeiden [wie in der Frage erwähnt] Wie kommt es, dass diese Zeit um 9 Stunden abgelaufen ist? (5 Stunden, 3 Stunden, etc.) auf derselben Seite]:

@JsonFormat(shape=JsonFormat.Shape.STRING, pattern="dd/MM/yyyy", timezone="EST") 

Zweitens denke ich, Sie Date.toString() verwenden Datum zu drucken. Note dass Java Date Klasse ist Zeitzone unabhängig, aber seine toString() Methode verwendet die Standard Zeitzone vor dem Drucken.

Hier sieht es so aus, als ob 24/07/2015 00:00 UTC zu 23/07/2015 19:00 EST von toString() konvertiert wird. Beide repräsentieren die gleichen Moment der Zeit, aber in verschiedenen Zeitzonen.

+0

Ich benutze nicht toString(), aber sicher, wenn @JsonFormat (shape = JsonFormat.Shape.STRING, Muster = "TT/MM/JJJJ"), toString wird vielleicht aufgerufen. Gibt es dafür eine Standardlösung? behalte nur gmt date ... aber müsste die Zeitzone des Benutzers kennen, um das Datum korrekt anzuzeigen. Vielleicht könnte etwas mit dem neuen Date von Java 8 oder Joda verwendet werden? –

+0

Es empfiehlt sich, die Datums-/Uhrzeitinformationen in UTC in der Datenbank zu speichern und die Zeitzone des Benutzers zu speichern. Verwenden Sie diese Zeitzone dann, wenn Sie dem Benutzer Daten anzeigen oder den Zeitzonen-Offset vor dem Speichern entfernen.Es gibt viele Artikel, die Vorteile dieses Ansatzes auflisten, d. H. Die Anwendung kann verschiedene Zeitzonen unterstützen. Java8 Date API hat eine neue Gruppe von Klassen zur Verfügung gestellt, die mit Datum/Uhrzeit arbeiten. Hier ist ein schöner Artikel über Java8 Date API https://dzone.com/articles/deeper-look-java-8-date-and. Java8 oder Joda vereinfacht die Behandlung von Datum und Zeitzone. – AimZ

+0

Das funktioniert für mich. Vielen Dank. – Elvermg