2015-11-16 6 views
5

Es ist often recommended, das Datum in der Datenbank in UTC gespeichert und angezeigt/empfangen von Benutzern in ihrer lokalen Zeitzone.Spring MVC - Konvertieren von Daten aus der Zeitzone des Benutzers in UTC

Ich versuche, dieses Muster in einer Spring MVC/Spring Boot-Anwendung zu implementieren, konnte jedoch keine Dokumentation oder Beispiele finden. Ich verwende @DateTimeFormat-Annotationen für die Attribute "java.util.Date" meiner @ModelAttribute-Formularobjekte, damit Spring Datumsangaben analysiert/formatiert.

Hat Spring dieses Muster unterstützt? Etwas in der Art von Django's timezone-aware datetimes wäre gut. Wenn nicht, gibt es eine nicht allzu umständliche Art, es zu implementieren? Oder gibt es eine bessere Möglichkeit, Datumsangaben in einer Spring MVC-Anwendung zu verarbeiten/zu speichern?

Im Moment ist die Anwendung nur in Großbritannien, daher brauche ich zur Zeit nur Unterstützung für BST (Sommerzeit), nicht unterschiedliche Zeitzonen für verschiedene Benutzer. Die Unterstützung von Benutzern in verschiedenen Zeitzonen ist jedoch eine potenzielle zukünftige Anforderung.

+0

sind Speichern Sie Ihr Datum in einem Kalender Date-Objekt o? – reos

+0

Haben Sie das jemals herausgefunden? Das interessiert mich auch sehr. – Andy

+0

@reos, speichern wir es als java.util.Date im Moment – frankoid

Antwort

0

Hoffe, dies wird Ihnen helfen oder zumindest wird der Punkt sein, von wo aus Sie beginnen können.

Sieht aus wie der beste Weg ist, OffsetDateTime Typ zum Speichern von Daten zu verwenden. Es ist leicht, Datums- und Uhrzeitwerte kommen von Benutzern zu UTC konvertieren:

OffsetDateTime createdOn = requestDto.getCreatedOn(); 
OffsetDateTime utc = createdOn.atZoneSameInstant(ZoneId.of("UTC")); 

und wieder zurück (natürlich müssen Sie speichern Benutzer Zeitzone zu):

OffestDateTime eventDate = modelObject.getEventDate(); 
OffsetDateTime userTime = eventDate.atZoneSameInstant(ZoneId.of(userTimeZone)); 

Um zu instanziiert neues Date-Objekt in UTC können Sie Uhr -Objekt verwenden:

OffestDateTime now = OffestDateTime.now(Clock.systemUTC()); 
ModelObject dto = new ModelObject(); 
dto.setEventDate(now); 

Und schließlich Wenn Sie keine Notwendigkeit, zeigen offse t, können Sie Local-Typ:

OffestDateTime eventDate = databaseModelObject.getEventDate(); 
LocalDateTime userTime = eventDate.atZoneSameInstant(ZoneId.of(userTimeZone)).toLocalDateTime()); 
ResponseDto response = new ResponseDto(); 
response.setEventDate(userTime); 
Verwandte Themen