web-dev-qa-db-ja.com

Java 8ナノ秒の解像度の8 Instant.now()?

Java 8のJava.time.Instantは「ナノ秒の解像度」で格納されますが、Instant.now()を使用してもミリ秒の解像度しか提供されません...

Instant instant = Instant.now();
System.out.println(instant);
System.out.println(instant.getNano());

結果...

2013-12-19T18:22:39.639Z
639000000

値が「今」であるが、ナノ秒の分解能を持つインスタントを取得するにはどうすればよいですか?

19
user1615355

デフォルトのJava8クロックはナノ秒の分解能を提供しませんが、これをJava測定機能時間差ナノ秒の分解能で)と組み合わせて、実際のナノ秒対応のクロックを作成できます。

public class NanoClock extends Clock
{
    private final Clock clock;

    private final long initialNanos;

    private final Instant initialInstant;

    public NanoClock()
    {
        this(Clock.systemUTC());
    }

    public NanoClock(final Clock clock)
    {
        this.clock = clock;
        initialInstant = clock.instant();
        initialNanos = getSystemNanos();
    }

    @Override
    public ZoneId getZone()
    {
        return clock.getZone();
    }

    @Override
    public Instant instant()
    {
        return initialInstant.plusNanos(getSystemNanos() - initialNanos);
    }

    @Override
    public Clock withZone(final ZoneId zone)
    {
        return new NanoClock(clock.withZone(zone));
    }

    private long getSystemNanos()
    {
        return System.nanoTime();
    }
}

これを使用するのは簡単です。Instant.now()に追加のパラメーターを指定するか、Clock.instant()を直接呼び出します。

    final Clock clock = new NanoClock();   
    final Instant instant = Instant.now(clock);
    System.out.println(instant);
    System.out.println(instant.getNano());

このソリューションは、NanoClockインスタンスを毎回再作成しても機能する可能性がありますが、常にコードの初期に初期化された格納されたクロックを使用し、必要な場所で使用することをお勧めします。

15
logtwo

ミリ秒の分解能さえ得られれば、自分は幸運だと考えることができます。

Instant可能性がありますモデルナノ秒の精度までの時間ですが、実時間の時間を追跡するコンピューター上の実際の機器の分解能は通常約10ミリ秒で、精度はほぼ間違いなくかなり高いですその下(100 msは楽観的な仮定です)。

これをSystem.nanoTime()と比較してください。これは、マイクロ秒単位の分解能を提供しますが、絶対的な実時間を提供しません。明らかに、そのような分解能を提供するために、作業においてすでにトレードオフが存在しますが、それでも3桁もナノ秒ではありません。

13
Marko Topolnik

インスタントメソッドpublic static Instant now(Clock clock)を使用して別のより正確なJava.time.Clockを使用することで、「ナノ秒」のインスタントのみを取得できます。ナノ秒。

ナノ秒の分解能(リアルタイム)で利用可能なクロックがないことに注意してください。 Java.time.Instantの内部ナノ秒表現機能は、主に、ナノ秒の精度で指定されたデータベースのタイムスタンプをマップする必要があるためです(ただし、通常はナノ秒まで正確ではありません)。

2015-12-29からの更新:Java-9はより良いクロックを提供します 私の新しい投稿 を参照してください。

4
Meno Hochschild

だから私はここでJavadocを掘り下げるのに少し時間を費やしました:

http://download.Java.net/jdk8/docs/api/Java/time/Instant.html

次のことができるはずです。

Instant inst = Instant.now();
long time = inst.getEpochSecond();
time *= 1000000000l; //convert to nanoseconds
time += inst.getNano(); //the nanoseconds returned by inst.getNano() are the nanoseconds past the second so they need to be added to the Epoch second

つまり、他の回答者は、正確なナノ秒の時刻を取得するのは非常に難しいことを指摘しています。コンピューターには通常、その解像度までの時間を追跡する能力がないためです。

4
StormeHawke