1

所以我有一个 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.

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

4

1 回答 1

1

java.time好吧,包括-package在内的大多数库都忽略了闰秒。但是,我的 lib 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

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

很高兴知道:您确实需要至少一个连接到 UTC 时间线的课程。像这样的类LocalDateTime没有时区的概念,因此它们与 UTC 没有联系,并且不能用于根据定义确定闰秒。

更多背景信息可以在我的DZone 论文中找到。

于 2020-04-20T03:00:22.870 回答