質問: javaのマイクロ秒単位の現在の時間 unixシステムでは、javaでマイクロ秒レベルの精度でタイムスタンプを取得する方法はありますか? cのgettimeofday関数のようなもの。
回答: system.nanotime()とsystem.currenttimemillis()の間のオフセットを決定するコンポーネントを作成し、エポック以降のナノ秒を効果的に取得できます。public class timerimpl implements timer { private final long offset; private static long calculateoffset() { final long nano = system.nanotime(); final long nanofrommilli = system.currenttimemillis() * 1_000_000; return nanofrommilli - nano; } public timerimpl() { final int count = 500; bigdecimal offsetsum = bigdecimal.zero; for (int i = 0; i < count; i++) { offsetsum = offsetsum.add(bigdecimal.valueof(calculateoffset())); } offset = (offsetsum.divide(bigdecimal.valueof(count))).longvalue(); } public long nownano() { return offset + system.nanotime(); } public long nowmicro() { return (offset + system.nanotime()) / 1000; } public long nowmilli() { return system.currenttimemillis(); } } 次のテストでは、マシン上でかなり良い結果が得られます。 final timer timer = new timerimpl(); while (true) { system.out.println(timer.nownano()); system.out.println(timer.nowmilli()); } 差は+ -3msの範囲で変動するようです。オフセットの計算をもう少し微調整できると思います。1495065607202174413 1495065607203 1495065607202177574 1495065607203 ... 1495065607372205730 1495065607370 1495065607372208890 1495065607370 ...