有没有办法在Java 8中将ZoneId转换为ZoneOffset?

我有一个纪元秒和一个zoneId(见下文)。method1

它可以转换为系统默认的zoneId,但我没有找到将epoch second转换为(见下文)的方法,因为没有.我认为这很晦涩难懂。LocalDateTimeLocalDateTimemethod2ZoneOffset.systemDefault

import java.time.{Instant, LocalDateTime, ZoneId, ZoneOffset}

val epochSecond = System.currentTimeMillis() / 1000

// method1
LocalDateTime.ofInstant(Instant.ofEpochSecond(epochSecond), ZoneId.systemDefault())

// method2
LocalDateTime.ofEpochSecond(epochSecond, 0, ZoneOffset.MAX)

注意

上面介绍的源代码是Scala


答案 1

以下是您如何从中获得:ZoneOffsetZoneId

Instant instant = Instant.now(); //can be LocalDateTime
ZoneId systemZone = ZoneId.systemDefault(); // my timezone
ZoneOffset currentOffsetForMyZone = systemZone.getRules().getOffset(instant);

注意:可以根据时间点和特定地点的历史有不同的偏移量。因此,选择不同的即时会导致不同的偏移。ZoneId

NB2:如果传递了 //etc,则可以返回 a 而不是 ,而不是像 .因此,如果传递了 UTC/GMT 偏移量,则不会考虑 其历史/地理/夏令时信息 - 您只需使用指定的偏移量即可。ZoneId.of()ZoneOffsetZoneIdUTC+3GMT+2Africa/CairoInstant


答案 2

没有一对一的映射。ZoneId 定义一个地理范围,其中随时间推移使用一组不同的区域偏移。如果时区使用夏令时,则其区域偏移在夏季和冬季之间将有所不同。

此外,夏令时规则可能随时间而变化,因此区域偏移可能在例如 2015 年 13 月 10 日与 1980 年 10 月 13 日不同。

因此,您只能在特定时刻找到 ZoneId 的区域偏移。

另请参见 https://en.wikipedia.org/wiki/Tz_database


推荐