如何获得DST间隙和重叠?

How to get the DST gap and overlap?

ZonedDateTime 似乎不允许检测给定的日期是否在 DST 间隙或重叠中。文档说 of 方法(创建 ZonedDateTime):

In the case of an overlap, when clocks are set back, there are two valid offsets. This method uses the earlier offset typically corresponding to "summer".

In the case of a gap, when clocks jump forward, there is no valid offset. Instead, the local date-time is adjusted to be later by the length of the gap.

^ 如上所述,此方法只会 return 一个值,但不会让我知道是否发生 DST 间隙或重叠。

我想知道提供的日期是否有空档或重叠,有空档或重叠的开始日期和结束日期。

例如:

“1920-09-01 00:10”时区 "Africa/Accra" 处于 DST 间隙
差距是从“1920-09-01 00:00:00+00:00”到“1920-09-01 00:20:00+00:20”.

“1920-12-30 23:50”时区 "Africa/Accra" 处于 DST 重叠
重叠涉及时期:
“1920-12-30 23:40:00+00:20”到“1920-12-31 00:00:00+00:20”和
“1920-12-30 23:40:00+00:00”到“1920-12-31 00:00:00+00:00”

如果出现上述示例中的间隔或重叠,我如何获取这些日期?

我认为创建处于间隙转换的 ZonedDateTime 在物理上是不可能的,因为从技术上讲,间隙转换跳过的本地日期时间是 "non-existent",并且 ZonedDateTime 对此非常严格。根据您的方法,它会抛出异常或调整到存在的时间。

您应该使用 LocalDateTime 进行此检查,而不是 ZonedDateTime

ZoneRules 有一个名为 getTransition 的非常方便的方法,它接受一个 LocalDateTime 并给你一个 ZoneOffsetTransition,代表一个 gap/overlap 转换,或者null 如果该日期时间没有转换。示例:

System.out.println(ZoneId.of("Africa/Accra").getRules()
                    .getTransition(LocalDateTime.of(1920, 9, 1, 00, 10)));

输出:

Transition[Gap at 1920-09-01T00:00Z to +00:20]

然后您可以从 ZoneOffsetTransition 对象中获取所需的所有信息(开始、结束、之前的偏移量、之后的偏移量、gap/overlap 等)。