在时区将ZonedDateTime转换为LocalDateTime

Vit*_*lii 15 java timezone datetime-conversion java-8 zoneddatetime

我有一个ZonedDateTime像这样构造的对象

ZonedDateTime z = ZonedDateTime.of(LocalDate.now().atTime(11, 30), ZoneOffset.UTC);
Run Code Online (Sandbox Code Playgroud)

我如何将其转换LocalDateTime为瑞士时区?预期结果应该是16 april 2018 13:30.

Jon*_*eet 33

如何在瑞士时区将其转换为LocalDateTime?

您可以将UTC ZonedDateTime转换为ZonedDateTime具有瑞士时区的UTC ,但保持同一时刻,然后在LocalDateTime需要时将其转出.我很想把它作为一个,ZonedDateTime除非你因为LocalDateTime其他原因需要它.

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();
Run Code Online (Sandbox Code Playgroud)


Ste*_*ers 14

它有助于理解 LocalDateTime 和 ZonedDateTime 之间的区别。你真正想要的是一个ZonedDateTime. 如果您想从字符串表示中删除时区,您可以将其转换为LocalDateTime.

你要找的是: ZonedDateTime swissZonedDateTime = withZoneSameInstant(ZoneId.of("Europe/Zurich"));

LocalDateTime - 这基本上是 a Dateand的美化字符串表示Time;它是时区不可知的,这意味着它不代表时间线上的任何时间点

Instant - 这是自 EPOCH 以来经过的时间的毫秒表示。这代表时间线上的特定时刻

ZonedDateTime -这也代表了一个时间表的时间瞬间,它代表了它作为一个DateTime一个TimeZone

下面的代码说明了如何使用所有 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]
Run Code Online (Sandbox Code Playgroud)

如果您要比较上面Instant两者的值ZonedDateTimes,它们将是等效的,因为它们都指向同一时刻。在格林威治的某个地方(UTC 时区),现在是 10 月 25 日中午;同时,在纽约,时间是上午 8 点(美国/纽约时区)。


Rav*_*ala 5

试试这个。用您的时区替换美国/中部。

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

System.out.println(z.withZoneSameInstant(ZoneId.of("US/Central")));
Run Code Online (Sandbox Code Playgroud)