java.time
现代答案使用 java.time,现代 Java 日期和时间 API。
ZoneId zone = ZoneId.of("Europe/London");
ZoneRules rules = zone.getRules();
ZonedDateTime now = ZonedDateTime.now(zone);
ZoneOffsetTransition transition = rules.nextTransition(now.toInstant());
Instant max = now.plusYears(15).toInstant();
while (transition != null && transition.getInstant().isBefore(max)) {
System.out.println(transition);
transition = rules.nextTransition(transition.getInstant());
}
输出,缩写:
Transition[Overlap at 2019-10-27T02:00+01:00 to Z]
Transition[Gap at 2020-03-29T01:00Z to +01:00]
Transition[Overlap at 2020-10-25T02:00+01:00 to Z]
Transition[Gap at 2021-03-28T01:00Z to +01:00]
Transition[Overlap at 2021-10-31T02:00+01:00 to Z]
Transition[Gap at 2022-03-27T01:00Z to +01:00]
Transition[Overlap at 2022-10-30T02:00+01:00 to Z]
(cut)
Transition[Overlap at 2033-10-30T02:00+01:00 to Z]
Transition[Gap at 2034-03-26T01:00Z to +01:00]
不过,我不会对数据过于信任。我不确定英国脱欧后(以及欧盟可能在 2021 年放弃夏令时 (DST) 之后)英国的时间会发生什么变化。
链接: Oracle 教程:解释如何使用 java.time 的日期时间。