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

5

这里的目标是将LocalDateTime转换为Epoch秒并相互转换。

假设我定义了一个LocalDateTime:

LocalDateTime now = LocalDateTime.now();

我想将其转换为亚洲/加尔各答时区的时间戳,这可以通过以下方式实现:
long epochSecondNow = now.atZone(ZoneId.of("Asia/Kolkata")).toEpochSecond();

现在,我想从epochSecondNow再次生成'now':
LocalDateTime类有一个方法'ofEpochSecond(long epochSecond,long nanoOfSecond, ZoneOffset zoneOffset)',该方法以epoch second、nano of second和ZoneOffset作为参数。
我无法使用"Asia/Kolkata"创建ZoneOffset。我应该如何创建我的区域的ZoneOffset对象,以便利用'ofEpochSecond'方法。还有其他方法吗?
谢谢!
2个回答

6
尝试使用Instant.ofEpochSecond来实现
Instant instant = Instant.ofEpochSecond(epochSecondNow);
ZonedDateTime atZone = instant.atZone(ZoneId.of("Asia/Kolkata"));
LocalDateTime localDateTime = atZone.toLocalDateTime();

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

谢谢,这样更好。我不想使用系统默认设置,因为我需要在应用程序层面上修复时区,而系统默认设置可能会因远程服务器而异。 - Anmol Gupta

0

我刚刚是这样做的,通过将偏移值作为字符串传递来获取ZoneOffset:

LocalDateTime nowFromEpochSecond = LocalDateTime.ofEpochSecond(epochSecondNow,0,ZoneOffset.of("+05:30"));

我希望有一种更简洁的方法来完成它,而不是硬编码偏移量和区域标识。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接