加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 正确处理闰秒

发布时间:2020-12-15 04:28:33 所属栏目:Java 来源:网络整理
导读:在闰秒之前和期间,似乎调用new Date()将返回23:59:59两次(一次在闰秒之前,一次在闰秒期间),而不是23:59:59和23:59 :60. 有没有办法(在应用程序中实现NTP客户端,或检查时钟倒退或重复自己)以确定给定秒是否是闰秒,以便正确呈现23:59 :60给用户? 就此而言,
在闰秒之前和期间,似乎调用new Date()将返回23:59:59两次(一次在闰秒之前,一次在闰秒期间),而不是23:59:59和23:59 :60.

有没有办法(在应用程序中实现NTP客户端,或检查时钟倒退或重复自己)以确定给定秒是否是闰秒,以便正确呈现23:59 :60给用户?

就此而言,主机操作系统是否有任何钩子来确定它是否在闰秒之前或之后?

解决方法

我们来看看 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-8不包含闰秒表(这将是任何UTC-SLS实现的基础). Threeten项目最初持有这样一个,但它已被删除(现在也是removed from the backport).
>从java.util.Date到Instant的转换只是1:1(参见源代码 – 不同的精度millis与nanos不同).请注意,就所谓的“Java时间标度”而言,Instant API中未提及java.util.Date.

The Java time-scale is used for all date-time classes. This includes
Instant,LocalDate,LocalTime,OffsetDateTime,ZonedDateTime and
Duration.

此外:java.util.Date的起源是1995年(当Java被发明时),但UTC-SLS是在几年后提出的.

那么Java-8还剩下什么作为闰秒支持呢?规范中的空字引起了很多混乱,没有别的.

你还能做什么?在JDK的范围内根本就没有.您需要的是具有内置闰秒数据的外部第三方库.一个例子是我的库Time4J – 参见这个article.另一个选项可能是它的类UTCInstant的库Threeten-Extra.但我还没有测试它转换为java.util.Date(似乎是怀疑?).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读