web-dev-qa-db-fra.com

Conversion de ZonedDateTime en LocalDateTime au fuseau horaire

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.

6
Vitalii

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();
17
Jon Skeet

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")));
3
Ravindra Ranwala

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).

1
Stevers