如何获得DST间隙和重叠?

问题描述 投票:1回答:1

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

在重叠的情况下,当时钟调回时,有两个有效偏移量。此方法通常使用较早的偏移量对应于“夏天”。

在有间隙的情况下,当时钟向前跳时,没有有效的偏移量。而是将本地日期时间调整为稍后间隙的长度。

^如上所读,此方法将只返回一个值,但不允许我知道是否发生DST间隙或重叠。

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

例如:

时区“非洲/阿克拉”的

“ 1920-09-01 00:10”位于DST间隔中。间隔为从“ 1920-09-01 00:00:00 + 00:00”到“ 1920-09-01 00:20:00 + 00:20”

时区“非洲/阿克拉”的

“ 1920-12-30 23:50”位于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”

如上述示例中出现间隔或重叠时,如何获得这些日期?

java java-time java.time
1个回答
1
投票

我不认为在间隙过渡中创建ZonedDateTime在物理上是不可能的,因为技术上“不存在”间隙过渡跳过的本地日期时间“不存在”,并且ZonedDateTime非常严格对这个。根据您的方法,它会抛出异常或将其调整为存在的时间。

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

ZoneRules具有这种非常方便的方法,称为getTransition,该方法采用getTransition并为您提供LocalDateTime,它表示间隙/重叠过渡,如果该日期时间没有过渡,则为ZoneOffsetTransition 。示例:

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] 对象中获取所需的所有信息(开始,结束,之前的偏移量,之后的偏移量,间隙/重叠等)。

© www.soinside.com 2019 - 2024. All rights reserved.