java - 如何获取DST间隙和重叠?

标签 java dst zoneddatetime java-time

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/

相关文章:

java - 是否可以检查 proto 文件中的枚举值?

java - 为什么 Java EE 是可扩展的?

python - 将 Pandas 中的 GMT 转换为本地时区

java - Kotlin/java - 如何将日期时间字符串转换为 Instant?

java - 通过 Jackson 的 ZonedDateTime 往返产生不相等的 ZonedDateTime

java - 本地日期时间解析

java - 使用 hibernate 进行多个子插入的父表

java - 无法转换 android.app.fragment

python - 现在的sqlite时区

go - 戈朗的夏令时