如何检测模糊的DST重叠?

时间:2017-04-04 14:41:51

标签: java java-8

当夏令时结束时,时钟会返回1小时。这意味着2017年11月5日将有2 01:30 AM。所以这是它将如何运作

01:59:58
01:59:59
01:00:00
01:00:01

正如您所看到的,当时间接近02:00:00时,它将返回1小时至01:00:00。这意味着11月5日将重叠一个小时。我需要检测给定的时间是否在重叠期内?

2 个答案:

答案 0 :(得分:1)

如果您对transition rules感兴趣,那么以下内容可能会对您有所帮助:

ZoneId yourZoneId = ...
List<ZoneOffsetTransitionRule> transitionRules = yourZoneId.getRules()
                                                           .getTransitionRules();

通过这些,您可以检查您的给定时间是否在规则的定义范围内,或者是否进行下一次转换。

The ZoneDateTime javadoc还包含有关&#34;差距&#34;的一些提示。和&#34;重叠&#34;和相应的抵消。

如果您只关心时间是否为夏令时,isDaylightSavings(Instant)可能对您有所帮助:

ZoneId yourZoneId = ZoneId.of("Europe/Rome");
Predicate<ZonedDateTime> isDaylightSavings = 
                           time -> yourZoneId.getRules()
                                             .isDaylightSavings(time.toInstant());

boolean isDaylightSaving = isDaylightSavings.test(ZonedDateTime.of(/* the time to test */, yourZoneId));
// returns true if time is daylight savings time or false otherwise

但是,如果您的时间已经是ZonedDateTime,那么这只会有意义。

答案 1 :(得分:1)

与您以前的SO帖子中的my answer类似,请询问区域规则并继续:

public static boolean isAmbivalent(LocalDateTime ldt, ZoneId zoneId) {
    return zoneId.getRules().getValidOffsets(ldt).size() > 1;
}

使用示例:

LocalDateTime ldt = LocalDateTime.of(2017, 11, 5, 1, 30);
ZoneId zoneId = ZoneId.of("America/Chicago");
System.out.println(isAmbivalent(ldt, zoneId)); // true, offsets either -5:00 or -6:00