のソースコードを見てみましょうjava.util.Date
:
public Date() {
this(System.currentTimeMillis());
}
したがって、質問は次のように読むことができます。
System.currentTimeMillis()
閏秒の値は 60 または 61 (仕様がふりをしているように) になりますか?
厳密な意味での答えは、基盤となるオペレーティング システムに依存します。しかし、実際には、Windows、Linux、Apple、Android などのよく知られているオペレーティング システムはすべて、うるう秒を認識していません。代わりに、これらのオペレーティング システムは、いつでも任意のクロック操作を行います (元に戻すなど、NTP サーバーとの同期など)。したがって、 -APIを使用してうるう秒を観察することはありません。Date
ちなみに、値 61 は不可能です。UTC 標準では、UTC が UT1 から 0.9 秒以上逸脱しないことが義務付けられており、その結果、2 重のうるう秒が挿入されないからです。
「61」の起源は、初期の POSIX 仕様からの大きな誤解です (この間違いは現在修正されています)。残念ながら、古い Java 仕様はまだ修正されておらず、現在まで誤解を招いています。
Java-8 について:
はい、いわゆる「Java Time-Scale」は正式に UTC-SLS として指定されています - その意図はむしろ NTP サーバーの内部実装に向けられた期限切れの提案に基づいています。UTC-SLS の実装は現実の世界には存在しません。Java-8でさえUTC-SLS を実装していません。2 つの事実がこの声明を証明しています。
Java-8 にはうるう秒テーブルが含まれていません (これは UTC-SLS 実装の基礎となります)。Threeten-project はもともとそのようなものを保持していましたが、削除されました (現在は backport からも削除されています)。
java.util.Date
からへの変換Instant
はちょうど 1:1 です (ソース コードを参照してください - 異なる精度のミリとナノは別として)。いわゆる「Java Time scale」に関してjava.util.Date
のAPIでは言及されていないことに注意してください。Instant
Java タイムスケールは、すべての日時クラスに使用されます。これには、Instant、LocalDate、LocalTime、OffsetDateTime、ZonedDateTime、および Duration が含まれます。
さらに: の起源java.util.Date
は 1995 年 (Java が発明されたとき) ですが、UTC-SLS は数年後に提案されました。
では、うるう秒のサポートとして Java-8 に何が残されているのでしょうか? スペック内の空の単語は多くの混乱を引き起こします。他には何もありません。
他に何ができますか?JDKの範囲内では、何もありません。必要なのは、うるう秒データが組み込まれた外部サードパーティ ライブラリです。例は、私のライブラリ Time4J です。この記事を参照してください。もう 1 つのオプションは、クラスUTCInstantを持つライブラリ Threeten-Extraです。しかし、私はその変換をテストしていませんjava.util.Date
(疑わしいと思われますか?)。