Convert ZonedDateTime To LocalDateTime At Time Zone


Answer :


How can I convert it to LocalDateTime at time zone of Switzerland?




You can convert the UTC ZonedDateTime into a ZonedDateTime with the time zone of Switzerland, but maintaining the same instant in time, and then get the LocalDateTime out of that, if you need to. I'd be tempted to keep it as a ZonedDateTime unless you need it as a LocalDateTime for some other reason though.



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();


It helps to understand the difference between LocalDateTime and ZonedDateTime. What you really want is a ZonedDateTime. If you wanted to remove the timezone from the string representation, you would convert it to a LocalDateTime.


What you're looking for is:
ZonedDateTime swissZonedDateTime = withZoneSameInstant(ZoneId.of("Europe/Zurich"));


LocalDateTime - this is basically a glorified string representation of a Date and Time; it is timezone agnostic, which means it does not represent any point in time on a timeline


Instant - this is a millisecond representation of time that has elapsed since EPOCH. This represents a specific instant in time on a timeline


ZonedDateTime - this also represents an instant in time on a timeline, but it represents it as a Date and Time with a TimeZone.


The code below illustrates how to use all 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]

If you were to compare the Instant values of both ZonedDateTimes from above, they would be equivalent because they both point to the same instant in time. Somewhere in Greenwich (UTC timezone), it is noon on October 25th; at the same time, in New York, it would be 8 am (America/NewYork timezone).



Try this out. Substitute US/Central with your timezone.



ZonedDateTime z = ZonedDateTime.of(LocalDate.now().atTime(11, 30), ZoneOffset.UTC);

System.out.println(z.withZoneSameInstant(ZoneId.of("US/Central")));


Comments

Popular posts from this blog

Converting A String To Int In Groovy

"Cannot Create Cache Directory /home//.composer/cache/repo/https---packagist.org/, Or Directory Is Not Writable. Proceeding Without Cache"

Android How Can I Convert A String To A Editable