所以我有一个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
。
我感谢对正确方向的任何帮助。
好吧,包括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
/从 转换。
很高兴知道:您确实至少需要一个连接到UTC时间线的类。像LocalDateTime
这样的类没有时区的概念,因此它们与 UTC 没有联系,并且根据定义无法用于确定闰秒。
更多背景信息可以在我的DZone论文中找到。