【问题标题】:How to get the DST gap and overlap?如何获得 DST 差距和重叠?
【发布时间】:2020-05-25 01:48:08
【问题描述】:

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 dst zoneddatetime java-time


    【解决方案1】:

    我认为在物理上不可能创建一个处于间隙转换中的ZonedDateTime,因为间隙转换跳过的本地日期时间在技术上是“不存在的”,而ZonedDateTime 相当对此严格。根据您的方法,它会抛出异常或调整到存在的时间。

    您应该使用LocalDateTimes 进行此检查,而不是ZonedDateTimes。

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

    【讨论】:

    • 一个 ZoneOffsetTransition 实际上有 isGapisOverlap 方法,事实上。
    猜你喜欢
    • 2021-12-14
    • 2018-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-18
    • 1970-01-01
    • 2020-02-19
    • 1970-01-01
    相关资源
    最近更新 更多