【问题标题】:How to compare a leapsecond with java.time and Junit?如何将闰秒与 java.time 和 Junit 进行比较?
【发布时间】:2020-01-15 16:36:51
【问题描述】:

所以我有一个 LocalDateTime 解析器,它接受一个日期作为字符串。 我已经为它写了几个测试,例如检查闰年等等。

现在我想要一个 JUnit 测试来检查闰秒。 我做了一些研究,发现 java.time(?) 可能是不可能的。 到目前为止,我找到了一个合适的闰秒日期。

这是我迄今为止尝试过的:

@Test
@DisplayName("Check for leap second")
void shouldLeapSecondOccurReturnExactlyTwoMinuteSpan() {
    String leapSecond = "2015-06-30T23:59:00+0000";
    String leapSecond2 = "2015-07-01T00:01:00";
    Assertions.assertTrue(DateConvertUtils.parseIso8601ToUTC(leapSecond)
   .isEqual(LocalDateTime.parse(leapSecond2).minusSeconds(120)));
}

DateConvertUtils 包含我上面提到的解析器和自定义DateTimeFormatter

感谢您对正确方向的任何帮助。

【问题讨论】:

  • 什么是DateConvertUtils...?
  • 据我所知,java.time 将忽略闰秒,请参阅How does the (Oracle) Java JVM know a leap second is occurring?(请参阅 Basil Bourque 的回答)。
  • 据我所知,java.time 中唯一的闰秒支持是Instant 可以解析闰秒。例如 Instant.parse("2015-06-30T23:59:60Z") 有效(但会输出 2015-06-30T23:59:59Z,因为 Instant 不能保持闰秒)。

标签: java time junit leap-second


【解决方案1】:

嗯,大多数库都忽略了闰秒,包括java.time-package。但是,我的库 Time4J 支持它。使用您的输入的示例:

    String s1 = "2015-06-30T23:59:00+0000";
    String s2 = "2015-07-01T00:01:00"; // no offset information

    ChronoFormatter<Moment> f =
        ChronoFormatter
            .ofMomentPattern(
                "uuuu-MM-dd'T'HH:mm:ss[X]", // optional offset
                PatternType.CLDR, 
                Locale.ROOT, 
                ZonalOffset.UTC); // default offset

    Moment m1 = f.parse(s1);
    Moment m2 = f.parse(s2); // no offset => UTC

    long delta = SI.SECONDS.between(m1, m2);
    System.out.println(delta); // 121

如果您愿意放弃可能的闰秒信息(如果您有 2015-06-30T23:60Z),Moment 类型的对象可以轻松转换为 java.time.Instant 或从 java.time.Instant 转换。

温馨提示:您确实需要至少一个与 UTC 时间线相关联的课程。 LocalDateTime 之类的类没有时区概念,因此它们与 UTC 没有任何联系,也无法用于根据定义确定闰秒。

更多背景信息可以在我的DZone paper找到。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-11
    相关资源
    最近更新 更多