【问题标题】:Fastest way to get nanos unix epoch time in Java在 Java 中获取 nanos unix 纪元时间的最快方法
【发布时间】:2026-01-27 23:25:01
【问题描述】:

我目前这样做是为了成功获取当前的纪元时间:

Instant inst = Instant.now();
long time = inst.getEpochSecond();
time *= 1000000000l;
time += inst.getNano();

但是,对于我的用例来说,它有点太慢了,在 JVM 预热后每次调用大约 1us

有更快的方法吗?

我很满意一个解决方案,它给我自纪元以来的微秒,只要它比上述更快。

【问题讨论】:

  • 大多数计算机硬件无法以纳秒为单位测量时间。
  • @JohannesKuhn 我很高兴有一个解决方案可以为我提供微秒而不是纳秒。
  • 您可能需要深入了解本机代码以获得高性能计时器。 Instant 方法一定会很慢,结果可能会有所不同。您将这些值用于什么目的?
  • 你用 System.currentTimeMillis() 试过了吗
  • @MohinuddinLuhar 我需要微分辨率

标签: java time timestamp unix-timestamp epoch


【解决方案1】:

可能的工作是运行:

long n1 = System.nanoTime();
long m = System.currentTimeMillis();
long n2 = System.nanoTime();

多次,直到 n1 和 n2 之间的差异小于您想要的分辨率(经过几次迭代,在我的 PC 上大约为 400 ns)。

然后您可以使用 n1(或 n2 或 2...的平均值)和 m * 1e6 之间的差异作为您需要添加到 System.nanoTime() 以获得当前纪元纳秒的偏移量。

免责声明:

  • System.nanoTime doc 明确指出分辨率至少是 System.currentTimeMillis() 的分辨率,可能大于 1 毫秒。所以不能保证你会得到微秒级的分辨率。
  • 推论:这可能不适用于所有环境(您可能永远无法获得足够小的 n2-n1 - 或者它可能只是因为您的系统分辨率太低而为 0)。
  • System.nanoTime() 可能会长时间不同步 - 所以这是精度和性能之间的权衡。
  • 您还需要考虑可能的算术溢出。

另请参阅:Current time in microseconds in java

【讨论】: