让我们来看看java.util.Date
的源代码:
public Date() {
this(System.currentTimeMillis());
}
所以问题可以理解为:
System.currentTimeMillis()
会产生闰秒值60甚至61吗(如规范所述)?
严格来说,答案取决于底层操作系统。但事实是:所有众所周知的操作系统,如Windows、Linux、Apple、Android都对闰秒不闻不问。相反,这些操作系统在任何时间进行任何时钟操作(回拨等,与NTP服务器同步...)。
因此,您将无法使用Date
-API观察到闰秒。顺便说一句,值61是不可能的,因为UTC标准规定UTC永远不会比UT1偏差超过0.9秒,导致不会插入双闰秒。
“61”的起源只是早期POSIX规范的一个严重误解(现在已经纠正了这个错误)。不幸的是,旧的Java规范尚未得到修正,直到现在仍然存在误解。
关于Java-8:
是的,所谓的“Java时间刻度”正式指定为UTC-SLS,基于一个已过期的提案,其目的更多是针对NTP服务器的内部实现。在现实世界中不存在任何UTC-SLS的实现。即使Java-8也没有实现UTC-SLS。两个事实证明了这一说法:
Java时间刻度用于所有日期时间类。 这包括
Instant,LocalDate,LocalTime,OffsetDateTime,ZonedDateTime和
Duration。
此外:
java.util.Date
的起源可以追溯到1995年(Java发明时),但 UTC-SLS 是几年后提出的。
那么在Java-8中剩下什么作为闰秒支持?规范中的空话引起了很多混乱,除此之外没有别的。
你还能做什么?在JDK范围内根本无法做任何事情。您需要一个带有内置闰秒数据的外部第三方库。例如我的库Time4J-请参阅此
article。另一个选择可能是Threeten-Extra库和它的类
UTCInstant。但我没有测试它是否能够转换为
java.util.Date
(似乎有问题?)。