Instant
にはメソッドがあります:
toEpochMilli
which この瞬間を1970-01-01T00:00:00Zのエポックからのミリ秒数に変換しますgetEpochSecond
which Java Epoch of 1970-01-01T00:00:00Zから秒数を取得します。これらの方法はどちらも精度を失います。 toEpochMilli
JavaDocにあります:
この瞬間の精度がミリ秒より大きい場合、ナノ秒単位の量が100万による整数除算の対象であるかのように、変換により余分な精度情報がドロップされます。
より正確なタイムスタンプを取得するための対応するメソッドがありません。 Java 8?でエポックからマイクロまたはナノの数を取得するにはどうすればよいですか?
Java.timeの一部として、Java.time.temporal.ChronoUnitの下に、2つの時点の差をほぼすべての単位の数値として取得するのに役立つ単位があります。例えば.
import Java.time.Instant;
import Java.time.temporal.ChronoUnit;
ChronoUnit.MICROS.between(Instant.Epoch, Instant.now())
そのインスタントのエポックからのマイクロ秒をロングとして与えます。
getNano()
とgetEpochSeconds()
を組み合わせて使用します。
int getNano()
タイムラインに沿って、秒の開始からのナノ秒数を取得します。 nanosecond-of-second値は、
getEpochSecond
によって返される秒からの合計ナノ秒数を測定します。
コメントが示唆するように、TimeUnit
を使用して目的の単位に変換します。
Instant inst = Instant.now();
// Nano seconds since Epoch, may overflow
long nanos = TimeUnit.SECONDS.toNanos(inst.getEpochSecond()) + inst.getNano();
// Microseconds since Epoch, may overflow
long micros = TimeUnit.SECONDS.toMicros(inst.getEpochSecond()) + TimeUnit.NANOSECONDS.toMicros(inst.getNano());
また、それらがいつオーバーフローするかを調べることもできます。
// 2262-04-11T23:47:16.854775807Z
Instant.ofEpochSecond(TimeUnit.NANOSECONDS.toSeconds(Long.MAX_VALUE),
Long.MAX_VALUE % TimeUnit.SECONDS.toNanos(1));
// +294247-01-10T04:00:54.775807Z
Instant.ofEpochSecond(TimeUnit.MICROSECONDS.toSeconds(Long.MAX_VALUE),
TimeUnit.MICROSECONDS.toNanos(Long.MAX_VALUE % TimeUnit.SECONDS.toMicros(1)))