LocalDateTime à ZonedDateTime

Que je dispose de Java 8 Printemps application web qui prennent en charge plusieurs régions. J'ai besoin de faire des événements de l'agenda pour un client. Donc disons que de mon site web et serveur Postgres est hébergé dans MST fuseau horaire (mais je suppose que cela pourrait être n'importe où si nous allons cloud). Mais le client est dans l'est. Donc, à la suite d'un certain nombre de meilleures pratiques que j'ai lu, j'ai pensé que je voudrais stocker tous date de fois en format UTC. Tous les champs de l'heure dans la base de données sont déclarées en tant que TIMESTAMP.

Donc, voici comment je prends un LocalDateTime et de les convertir au format UTC:

ZonedDateTime startZonedDT = ZonedDateTime.ofLocal(dto.getStartDateTime(), ZoneOffset.UTC, null);
//appointment startDateTime is a LocalDateTime
appointment.setStartDateTime( startZonedDT.toLocalDateTime() );

Maintenant , par exemple, lorsqu'un rechercher une date arrive, je dois convertir à partir de la date demandée temps UTC, obtenir les résultats et de les convertir à l'utilisateur du fuseau horaire (stockées dans la base de données):

ZoneId  userTimeZone = ZoneId.of(timeZone.getID());
ZonedDateTime startZonedDT = ZonedDateTime.ofLocal(appointment.getStartDateTime(), userTimeZone, null);
dto.setStartDateTime( startZonedDT.toLocalDateTime() );

Maintenant, je ne suis pas sûr que c'est la bonne approche. Je me demande également si, parce que je vais partir LocalDateTime à ZonedDateTime et vice versa, j'ai peut-être de perdre le fuseau horaire info.

Voici ce que je vois et il ne me semble pas correct pour moi. Lorsque je reçois la LocalDateTime à partir de l'INTERFACE utilisateur, j'obtiens ceci:

2016-04-04T08:00

La ZonedDateTime =

dateTime=2016-04-04T08:00
offset="Z"
zone="Z"

Et puis, quand j'affecter cette valeur convertie à mon rendez-vous LocalDateTime je store:

2016-04-04T08:00

J'ai envie parce que je suis le stockage dans LocalDateTime je perds le fuseau horaire que j'ai converti en ZonedDateTime.

Je dois faire mon entité (rendez-vous) utilisez ZonedDateTime au lieu de LocalDateTime de sorte que Postgres ne pas perdre cette information?

---------------- Modifier ----------------

Après Basile excellente réponse, j'ai réalisé que j'ai le luxe de ne pas se soucier des utilisateurs fuseau horaire - tous les rendez-vous sont à l'encontre d'un endroit précis de sorte que je peux stocker tous date de fois que l'UTC, puis de les convertir à l'emplacement de fuseau horaire lors de la récupération. J'ai fait la suite suivi question

Votre application doit d'informations de fuseau horaire?
Concernant votre "Modifier" de l'article, à savoir que les politiciens amour pour redéfinir les zones de temps, de décalage, de l'Heure d'été (DST), etc. Donc, ne jamais aller loin dans l'avenir avec des valeurs d'UTC. Si tu parles de l'hygiène dentaire, les nominations sont faites longtemps à l'avance, ex. “3 H, le 5 décembre, 2017 plus tard cette année”, alors vous pouvez en effet de vouloir utiliser un LocalDateTime pour stocker ce fait. L'intention il y a 3 PM toutefois, les responsables politiques ont redéfini ce moment-là. Pour un calendrier que vous pourriez appliquer temporairement le fuseau horaire pour le potentiel LocalDateTime pour générer un réel moment comme un ZonedDateTime/Instant.

OriginalL'auteur sonoerin | 2016-04-05