【问题标题】:Java 8 ZoneOffset - How to get current system UTC offsetJava 8 ZoneOffset - 如何获取当前系统 UTC 偏移量
【发布时间】:2017-07-17 01:30:48
【问题描述】:

我想获取我系统的当前 ZoneOffset
我试图这样做,但我找不到办法。
另外,我一直在寻找解决方案,但没有找到任何解决方案。
在Java中可以做到这一点吗?

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

【问题讨论】:

标签: java time java-8 utc java-time


【解决方案1】:

您的请求分为两部分:

  • “我的系统”的偏移量-因此您需要系统时区-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()

【讨论】:

  • 像我的其他评论一样确认。
  • 不错的紧凑答案。另外,从 ZoneOffset 到 millis 的方法如下: OffsetDateTime.now().getOffset().get(ChronoField.OFFSET_SECONDS) * 1000L;
【解决方案2】:

是的,有可能:

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

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

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

【讨论】:

  • 这两个选项之间有一个关键的区别。 Instant 版本总会给出正确答案。 LocalDateTime 版本将提供 "best available offset"。这是因为夏令时,LocalDateTime 可能有两个有效的偏移量,或者没有。
  • 我可以确认,当两个示例都运行时,巴西会发生以下情况:如果在 DST 之外运行,则返回 -03:00;如果在 DST 中运行,则返回 -02:00。通过更改系统日期进行测试。
猜你喜欢
  • 1970-01-01
  • 2014-07-27
  • 1970-01-01
  • 1970-01-01
  • 2016-01-06
  • 2011-07-26
  • 2013-08-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多