Java 8 ZoneOffset - 如何获取当前系统的UTC偏移量

18

我想获取当前系统的ZoneOffset
我尝试过,但无法找到方法。
此外,我也在寻找解决方案,但没有找到任何有用的信息。
在Java中可能吗?

编辑:
我的问题与这个问题不同。我想知道当前系统的UTC时间,而不是如何在时区偏移表示或时区存储之间进行转换。


2
可能是 Java TimeZone offset 的重复问题。 - Muhammad Saqlain
2个回答

34

您的请求有两个部分:

  • "我的系统" 的偏移量 - 因此您需要系统时区 - ZoneId.systemDefault()
  • "当前" 偏移量 - 因此您需要当前的瞬间 - Instant.now()

这些使用 ZoneRules 绑定在一起,以获得以下结果:

ZoneOffset o = ZoneId.systemDefault().getRules().getOffset(Instant.now());

为了简单起见,您可能希望使用OffsetDateTime

ZoneOffset o = OffsetDateTime.now().getOffset();

这个功能之所以可行是因为 OffsetDateTime.now() 内部同时使用了 ZoneId.systemDefault()Instant.now()


确认,就像我的另一个评论一样。 - GuiRitter
不错的简洁回答。此外,以下是从ZoneOffset到毫秒的方法:OffsetDateTime.now().getOffset().get(ChronoField.OFFSET_SECONDS) * 1000L; - Wheezil

27

没错,这是可能的:

ZoneOffset.systemDefault().getRules().getOffset(Instant.now())

或者您可以将 Instant 实例替换为 LocalDateTime 实例:

ZoneOffset.systemDefault().getRules().getOffset(LocalDateTime.now())

4
这两个选项之间有一个关键的区别。Instant 版本将始终给出正确的答案。而 LocalDateTime 版本将给出 "可用最佳偏移",这是由于夏令时的缘故,在 LocalDateTime 中可能存在两个有效的偏移量,或者根本没有有效的偏移量。 - JodaStephen
我可以确认,当两个示例都运行时,在巴西会发生以下情况:如果在夏令时之外运行,则返回“-03:00”;如果在夏令时期间运行,则返回“-02:00”。通过更改系统日期进行测试。 - GuiRitter

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