在时区将 ZonedDateTime 转换为 LocalDateTime

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

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

如何将其转换为瑞士时区?预期结果应为 。LocalDateTime16 april 2018 13:30


答案 1

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

您可以将UTC转换为具有瑞士时区的UTC,但保持相同的时间,然后在需要时将其从中解脱出来。我会忍不住把它作为一个,除非你出于其他原因需要它。ZonedDateTimeZonedDateTimeLocalDateTimeZonedDateTimeLocalDateTime

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

答案 2

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

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

LocalDateTime - 这基本上是一个和的光荣字符串表示;它是时区不可知的,这意味着它不代表时间轴上的任何时间点DateTime

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

ZonedDateTime - 这也表示时间轴上的时间刻,但它表示为带有 .DateTimeTimeZone

下面的代码说明了如何使用所有 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]

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


推荐