Java 如何检测不明确的DST重叠?

Java 如何检测不明确的DST重叠?,java,java-8,Java,Java 8,夏时制结束时,时钟倒转1小时。这意味着将于2017年11月5日凌晨2点30分举行。这就是它的工作原理 01:59:58 01:59:59 01:00:00 01:00:01 如您所见,当时间接近02:00:00时,它将返回1小时到01:00:00。这意味着11月5日将有一个小时的重叠。我需要检测给定的时间是否在重叠时间段内?如果您感兴趣,则以下内容可能会帮助您: ZoneId yourZoneId = ... List<ZoneOffsetTransitionRule> trans

夏时制结束时,时钟倒转1小时。这意味着将于2017年11月5日凌晨2点30分举行。这就是它的工作原理

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

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

如果您感兴趣,则以下内容可能会帮助您:

ZoneId yourZoneId = ...
List<ZoneOffsetTransitionRule> transitionRules = yourZoneId.getRules()
                                                           .getTransitionRules();
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
但是,只有当您的时间已经是分区DateTime时,这才有意义。类似于您之前的SO帖子,询问分区规则后,您可以:

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

您是否尝试过使用joda时间库解析这些值?我知道我在处理时间变化前后的日期时遇到了库中的一个特定异常,因此它可能会提供一些检测它的背景信息。我不确定joda time的内部java版本如何处理这种情况。