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.
^ 如上所述,此方法只会返回一个值,但不允许我知道是否发生 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”
如上例所示,如果出现间隙或重叠,如何获取这些日期?
最佳答案
我认为在物理上不可能创建处于间隙转换中的 ZonedDateTime
,因为间隙转换跳过的本地日期时间在技术上“不存在”,并且ZonedDateTime
对此非常严格。根据您的方法,它会抛出异常或调整到现有的时间。
您应该使用 LocalDateTime
进行此检查,而不是 ZonedDateTime
。
ZoneRules
有一个非常方便的方法,名为 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]
然后,您可以从 ZoneOffsetTransition
对象中获取所需的所有信息(开始、结束、之前偏移、之后偏移、间隙/重叠等)。
关于java - 如何获取DST间隙和重叠?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60138604/