J'ai un objet de ZonedDateTime
qui est construit comme ça
ZonedDateTime z = ZonedDateTime.of(LocalDate.now().atTime(11, 30), ZoneOffset.UTC);
Comment puis-je le convertir en LocalDateTime
dans le fuseau horaire de la Suisse? Le résultat attendu devrait être 16 april 2018 13:30
.
Comment puis-je le convertir en LocalDateTime dans le fuseau horaire de la Suisse?
Vous pouvez convertir UTC ZonedDateTime
en une ZonedDateTime
avec le fuseau horaire de la Suisse, mais en maintenant le même instant dans le temps, puis extraire la LocalDateTime
si nécessaire. Je serais tenté de le garder comme ZonedDateTime
à moins que vous n'en ayez besoin comme LocalDateTime
pour une autre raison.
ZonedDateTime utcZoned = ZonedDateTime.of(LocalDate.now().atTime(11, 30), ZoneOffset.UTC);
ZoneId swissZone = ZoneId.of("Europe/Zurich");
ZonedDateTime swissZoned = utcZoned.withZoneSameInstant(swissZone);
LocalDateTime swissLocal = swissZoned.toLocalDateTime();
Essayez ceci. Remplacez US/Central par votre fuseau horaire.
ZonedDateTime z = ZonedDateTime.of(LocalDate.now().atTime(11, 30), ZoneOffset.UTC);
System.out.println(z.withZoneSameInstant(ZoneId.of("US/Central")));
Cela aide à comprendre la différence entre LocalDateTime et ZonedDateTime. Ce que vous voulez vraiment, c'est un ZonedDateTime. Si vous souhaitez supprimer le fuseau horaire de la représentation sous forme de chaîne, convertissez-le en LocalDateTime.
Ce que vous recherchez est: ZonedDateTime swissZonedDateTime = withZoneSameInstant (ZoneId.of ("Europe/Zurich"));
LocalDateTime - il s’agit d’une représentation sous forme de chaîne enrichie d’une date et d’une heure; il est agnostique selon le fuseau horaire, ce qui signifie qu'il ne représente aucun instant dans le temps
Instant - il s'agit d'une représentation de la milliseconde du temps écoulé depuis l'époque. Ceci représente un moment précis dans le temps
ZonedDateTime - ceci représente également un instant dans le temps sur une timeline, mais en tant que date et heure avec un fuseau horaire.
Le code ci-dessous montre comment utiliser les 3.
LocalDateTime localDateTime = LocalDateTime.of(2018, 10, 25, 12, 00, 00); //October 25th at 12:00pm
ZonedDateTime zonedDateTimeInUTC = localDateTime.atZone(ZoneId.of("UTC"));
ZonedDateTime zonedDateTimeInEST = zonedDateTimeInUTC.withZoneSameInstant(ZoneId.of("America/New_York"));
System.out.println(localDateTime.toString()); // 018-10-25T12:00
System.out.println(zonedDateTimeInUTC.toString()); // 2018-10-25T12:00Z[UTC]
System.out.println(zonedDateTimeInEST.toString()); // 2018-10-25T08:00-04:00[America/New_York]
Si vous compariez les valeurs Instant des deux ZonedDateTimes d’en haut, elles seraient équivalentes car elles renvoient toutes les deux au même instant. Quelque part à Greenwich (fuseau horaire UTC), il est midi le 25 octobre; dans le même temps, il serait 8 heures à New York (fuseau horaire Amérique/New York).