2015-11-16 10 views
5

È often recommended che i dati vengono memorizzati nel database in UTC e visualizzati/ricevuti dagli utenti nel loro fuso orario locale.Spring MVC - converte le date dal fuso orario dell'utente in UTC

Sto cercando di implementare questo modello in un'applicazione Spring MVC/Spring Boot ma non sono riuscito a trovare documentazione o esempi. Sto usando le annotazioni @DateTimeFormat sugli attributi java.util.Date dei miei oggetti modulo @ModelAttribute per rendere le date di parser/formato di Spring.

Spring ha integrato il supporto per questo modello? Qualcosa sulla falsariga di Django's timezone-aware datetimes andrebbe bene. Se no, esiste un modo non troppo ingombrante di attuarlo? O c'è un modo migliore per gestire/memorizzare i tempi di consegna in un'applicazione Spring MVC?

Al momento l'applicazione è solo per il Regno Unito, quindi al momento ho solo bisogno di supporto per BST (ora legale), non diversi fusi orari per utenti diversi. Tuttavia, supportare gli utenti in fusi orari diversi è un potenziale requisito futuro.

+0

sono possibilità di immagazzinarli la data in un oggetto data di calendario o? – reos

+0

Lo hai mai capito? Sono anche molto interessato a questo. – Andy

+0

@reos, lo stiamo archiviando come java.util.Date al momento – frankoid

risposta

0

Spero che questo ti aiuterà o almeno sarà il punto da cui potresti iniziare.

Sembra che il modo migliore sia utilizzare il tipo OffsetDateTime per memorizzare le date. E 'facile convertire i valori dateTime provenienti da utente a UTC:

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

e viceversa (ovviamente è necessario memorizzare gli utenti fuso orario troppo):

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

Per istanziare nuovo oggetto Date in UTC è possibile utilizzare orologio -Oggetto:

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

E infine Se non c'è bisogno di mostrare offse t, è possibile utilizzare LocalDateTime Tipo:

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