Convertir ZonedDateTime à LocalDateTime au fuseau horaire
J'ai un objet de ZonedDateTime
qui est construit de la façon
ZonedDateTime z = ZonedDateTime.of(LocalDate.now().atTime(11, 30), ZoneOffset.UTC);
Comment puis-je convertir LocalDateTime
au fuseau horaire de la Suisse? Résultat attendu doit être 16 april 2018 13:30
.
- En aparté, passer une
ZoneId
àLocalDate.now()
trop pour obtenir des résultats prévisibles. Il n'est jamais à la même date partout sur le globe.
Vous devez vous connecter pour publier un commentaire.
Vous pouvez convertir au format UTC
ZonedDateTime
dans unZonedDateTime
avec le fuseau horaire de la Suisse, mais en conservant le même instant dans le temps, et puis obtenir leLocalDateTime
en dehors de cela, si vous en avez besoin. Je serais tenté de le garder comme unZonedDateTime
si vous en avez besoin comme unLocalDateTime
pour une autre raison bien.Elle aide à comprendre la différence entre LocalDateTime et ZonedDateTime. Ce que vous voulez vraiment est un ZonedDateTime. Si vous souhaitiez supprimer le fuseau horaire de la représentation de chaîne, vous convertir un LocalDateTime.
Ce que vous cherchez est:
ZonedDateTime swissZonedDateTime = withZoneSameInstant(ZoneId.d'("Europe/Zurich"));
LocalDateTime -c'est fondamentalement une simple chaîne de la représentation de la Date et de l'Heure; c'est le fuseau horaire agnostique, ce qui signifie qu'il ne représente pas n'importe quel point dans le temps sur un scénario
Instant - c'est un millième de seconde représentation du temps qui s'est écoulé depuis l'ÉPOQUE. Cela représente un instant spécifique dans le temps sur un scénario
ZonedDateTime - cela représente aussi un instant dans le temps sur un scénario, mais il la représente comme une Date et une Heure avec un Fuseau horaire.
Le code ci-dessous illustre l'utilisation de tous les 3.
Si vous deviez par rapport à l'Instant les valeurs des deux ZonedDateTimes à partir de ci-dessus, ils seraient équivalentes, car elles pointent vers le même instant dans le temps. Quelque part dans Greenwich (fuseau horaire UTC) il est midi, le 25 octobre; dans le même temps, à New York, il serait 8h (America/NewYork time zone).
Essayer. Remplacer US/Central avec votre fuseau horaire.
Une autre option, qui semble un peu plus intuitive consiste à convertir le zonage de date pour un instant, puis utilisez LocalDateTime.ofInstant:
Je préfère cela à
withZoneSameInstant
parce que cette solution peu plus opaque, - vous êtes l'obtention d'un ZonedDateTime qui doit être dans un état interne (le fuseau horaire correct). À l'aide deofInstant
peut être utilisé sur n'importe quel ZonedDateTime dans n'importe quel fuseau horaire.