如何获得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 等)。
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 等)。