如何在 Java 8 中正确使用 ZoneOffset、ZoneId 和 LocalDateTime?

Anm*_*pta 5 java java-time

这里的目标是将 LocalDateTime 来回转换为纪元秒。

假设我有一个 LocalDateTime 定义为:

LocalDateTime now = LocalDateTime.now();
Run Code Online (Sandbox Code Playgroud)

我想将其转换为亚洲/加尔各答时区的纪元秒,我可以这样做:

long epochSecondNow = now.atZone(ZoneId.of("Asia/Kolkata")).toEpochSecond();
Run Code Online (Sandbox Code Playgroud)

现在,我想从 epochSecondNow 再次生成“现在”:

LocalDateTime 类有一个方法 ' ofEpochSecond(long epochSecond,long nanoOfSecond, ZoneOffset zoneOffset)',它以纪元秒、nano of second 和 ZoneOffset 作为参数。

我无法使用“Asia/Kolkata”创建 ZoneOffset。我应该如何为我的区域制作 ZoneOffset 对象以使用 'ofEpochSecond' 方法。有没有其他办法?

谢谢!

Vie*_*iet 6

尝试与 Instant.ofEpochSecond 一起使用

Instant instant = Instant.ofEpochSecond(epochSecondNow);
ZonedDateTime atZone = instant.atZone(ZoneId.of("Asia/Kolkata"));
LocalDateTime localDateTime = atZone.toLocalDateTime();
Run Code Online (Sandbox Code Playgroud)

如果要使用系统时区,可以使用 ZoneId.systemDefault()


Anm*_*pta 0

好吧,我只是通过以下方式完成此操作,通过将偏移值作为字符串传递来获取 ZoneOffset:

LocalDateTime nowFromEpochSecond = LocalDateTime.ofEpochSecond(epochSecondNow,0,ZoneOffset.of("+05:30"));
Run Code Online (Sandbox Code Playgroud)

我希望有一种更干净的方法来做到这一点,而不是硬编码偏移量和区域 ID。