1. ホーム
  2. java

新しいJava 8のDate Time APIは、なぜナノ秒の精度を持たないのですか?[重複]。

2023-09-02 13:20:55

質問

Java 8の新しいDate Time APIの機能の1つは、ナノ秒の精度であるとされています。しかし、私が現在のDate Timeを次のようにコンソールに出力すると

DateTimeFormatter formatter = DateTimeFormatter
    .ofPattern("yyyy-MM-dd'T'HH:mm:ss,nnnnnnnnnZ");
System.out.println(OffsetDateTime.now().format(formatter)); 

ミリ秒の精度しか見えません:2015-11-02T12:33:26,746000000+0100

オペレーティング システムは、ナノ秒の精度をサポートしているようです。ターミナルで現在の日付時刻を印刷すると、次のようになります。

date -Ins

なるほど 2015-11-02T12:33:26,746134417+0100

Javaでナノ秒の精度を得るにはどうしたらいいですか?Ubuntu 14.04 64bitでOracle Java 1.8.0_66を動かしています。

どのように解決するのですか?

この java.time API全般 はナノ秒の精度を持ちます。例えば

DateTimeFormatter formatter = DateTimeFormatter
    .ofPattern("yyyy-MM-dd'T'HH:mm:ss,nnnnnnnnnZ");
OffsetDateTime odt = OffsetDateTime.of(2015, 11, 2, 12, 38, 0, 123456789, ZoneOffset.UTC);
System.out.println(odt.format(formatter));

出力します。

2015-11-02T12:38:00,123456789+0000

しかし、これは OffsetDateTime.now() で返される時計の値で、ミリ秒しか持たない値を返しています。

から Clock の実装をJava 8で実装しました。

ここで提供されるクロックの実装は System.currentTimeMillis() . この方法は、時計の精度についてほとんど、あるいは全く保証しません。より正確な時計を必要とするアプリケーションは、NTPサーバーのような別の外部時計を使用して、この抽象クラスを自分で実装する必要があります。

つまり、ここには本質的に不正確なものはありません。 Clock を使用しています。 System.currentTimeMillis() . より精密なサブクラスを独自に作成することも可能でしょう。しかし、より精度の高いサブクラスを作るには、より多くの 精度 を追加することは、おそらくあまり有用ではありません。(確かにそうなる場合もあるかもしれませんが...)