web-dev-qa-db-ja.com

インスタントをエポック時間からマイクロ秒に変換する

Instantにはメソッドがあります:

  • toEpochMilli which この瞬間を1970-01-01T00:00:00Zのエポックからのミリ秒数に変換します
  • getEpochSecond which Java Epoch of 1970-01-01T00:00:00Zから秒数を取得します。

これらの方法はどちらも精度を失います。 toEpochMilli JavaDocにあります:

この瞬間の精度がミリ秒より大きい場合、ナノ秒単位の量が100万による整数除算の対象であるかのように、変換により余分な精度情報がドロップされます。

より正確なタイムスタンプを取得するための対応するメソッドがありません。 Java 8?でエポックからマイクロまたはナノの数を取得するにはどうすればよいですか?

11
Michal Kordas

Java.timeの一部として、Java.time.temporal.ChronoUnitの下に、2つの時点の差をほぼすべての単位の数値として取得するのに役立つ単位があります。例えば.

import Java.time.Instant;
import Java.time.temporal.ChronoUnit;

ChronoUnit.MICROS.between(Instant.Epoch, Instant.now())

そのインスタントのエポックからのマイクロ秒をロングとして与えます。

10
pdxleif

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)))
15
xiaofeng.li