使用日光进行本地时间验证

时间:2016-12-29 01:46:53

标签: java validation time dst

我们要求java在传递给石英等调度程序之前验证本地时间。系统收到伦敦当地时间01:30 AM,但这次在2017年3月26日无效(夏令时)。 如何编写代码以输出结果?

输入

12:30, 01:30, 02:30

输出

Mar 26 2017 12:30   ->  Valid, GMT   
Mar 26 2017 01:30   ->  Invalid, NA   
Mar 26 2017 02:30   ->  Valid, BST

2 个答案:

答案 0 :(得分:1)

假设您从LocalDateTime开始,那么您可以通过查看给定时区是否报告当时存在有效偏移来测试它是否对调度有效。此信息可在ZoneRules课程中找到。

以下是一些示例代码:

@Test
public void test() throws Exception {

    TimeZone tz = TimeZone.getTimeZone("Europe/London");
    ZoneId londonZone = tz.toZoneId();

    String springAhead = "2017-03-26T01:30";

    assertFalse(isValidForScheduling(londonZone, LocalDateTime.parse(springAhead)));

    String fallBack = "2017-10-29T01:30";

    assertFalse(isValidForScheduling(londonZone, LocalDateTime.parse(fallBack)));
}

private boolean isValidForScheduling(ZoneId zoneId, LocalDateTime ldt) {
    ZoneRules rules = zoneId.getRules();

    List<ZoneOffset> validOffsets = rules.getValidOffsets(ldt);
    return validOffsets.size() == 1;
}

如果validOffsets列表为空,那么它不是有效时间。如果有超过1个条目,那么该区域中的时间会多次出现(将时钟放回的情况)。如果只有一个条目,那么它是一个常规时间。

您可能希望在空列表中失败,并在包含多个条目的列表上发出警告。

答案 1 :(得分:0)

以下代码错误仅适用于2017年3月26日凌晨1点至凌晨2点。我不喜欢它的编写方式。可以重构吗?这不是2017年10月29日的错误。
LocalDateTime localDateTime = LocalDateTime.of(2017, 3, 26, hours, minutes);
ZonedDateTime zonedDateTime = ZonedDateTime.of(localDateTime, ZoneId.of("Europe/London"));
if ( zonedDateTime.getHour() != localDateTime.getHour() ) {
   System.out.println("MISMATCH!!!");
}