问题 确定未来的时区转换


我需要预测下一个至少2个时区转换何时适用于特定时区。

Java 8提供了新的功能 java.time API,具体而言 java.time.zoneZoneRules.getTransitions() 看起来正是我需要的,但它没有列出2010年以后的“澳大利亚/悉尼”。

确定下一个2个时区转换的日期/时间/偏移的最可靠方法是什么?


1526
2017-08-03 07:13


起源

@Thirler你不能拼写;) - pstanton
对不起:) - Thirler
一般来说,这是不可能的,因为政府可以改变将来适用的规则。他们有时会在短时间内改变。应该可以获得下一个 知道 过渡。 - Raedwald
我想Raedwald所说的“一般来说,这是无法做到的”是指任何此类列表只是基于当前定义的规则的预测,但由于政治决策,这些规则会不时发生变化。无法保证任何这些时区转换实际发生,或明天列表将是相同的。 - Hulk
注意 ZoneRules.getTransitionRules的java文档 包含诸如“如果区域没有夏令时,或者有关未来变化的信息不确定,则列表将为空”的语句。 - Hulk


答案:


方法 ZoneRules.getTransitions() 没有列出所有过渡直到无限到未来(显然)。这将获得接下来的两个转换:

ZoneId zoneId = ZoneId.of("Australia/Sydney");
ZoneRules rules = zoneId.getRules();

ZoneOffsetTransition nextTransition = rules.nextTransition(Instant.now());
System.out.println("Next transition at: " +
        nextTransition.getInstant().atZone(zoneId));

ZoneOffsetTransition nextNextTransition =
        rules.nextTransition(nextTransition.getInstant());
System.out.println("Next transition after that at: " +
        nextNextTransition.getInstant().atZone(zoneId));

输出:

下一次转型时间:2016-10-02T03:00 + 11:00 [澳大利亚/悉尼]

之后的下一次过渡:2017-04-02T02:00 + 10:00 [澳大利亚/悉尼]


14
2017-08-03 07:29



是的,仍然感到惊讶'getTransitions'至少没有列出所有到今天(即所有过去) - 感谢解决方案,效果很好。 - pstanton
getTransitions() (或者没有 getFutureTransitions())是我见过的最好的例子,可能是一个有用的无限 Stream。 - Thirler
@Thirler建立自己并不难 getFutureTransitions() 无限的 Stream: Stream.iterate(rules.nextTransition(Instant.now()), t -> rules.nextTransition(t.getInstant())) - Flown
的状态 ZoneRules 有两个部分 - 通过访问过渡(已知的历史) getTransitions()和通过访问的转换规则(不确定的未来) getTransitionRules()。该 nextTransition(Instant) 方法将两个状态胶合在一起。 - JodaStephen