在 java 中,当前时间(以微秒为单位)tl;博士详java.time

2022-08-31 09:15:36

在Unix系统上,有没有办法在Java中获得具有微秒级精度的时间戳?类似于 C 的函数。gettimeofday


答案 1

不,Java没有这种能力。

它确实有System.nanoTime(),但这只是给出了一些以前已知的时间的偏移。因此,虽然您无法从中获取绝对数字,但您可以使用它来测量纳秒(或更高)精度。

请注意,JavaDoc表示,虽然这提供了纳秒级精度,但这并不意味着纳秒级精度。因此,取一些适当大的返回值模量。


答案 2

tl;博士

Java 9 及更高版本:捕获当前时刻时分辨率高达纳秒。这是 9 位小数位数。

Instant.now()   

2017-12-23T12:34:56.123456789Z

若要限制为微秒,请截断

Instant                // Represent a moment in UTC. 
.now()                 // Capture the current moment. Returns a `Instant` object. 
.truncatedTo(          // Lop off the finer part of this moment. 
    ChronoUnit.MICROS  // Granularity to which we are truncating. 
)                      // Returns another `Instant` object rather than changing the original, per the immutable objects pattern. 

2017-12-23T10:43:56.123456Z

在实践中,您只会看到微秒捕获,因为当代传统的计算机硬件时钟在纳秒内并不精确。.now

其他答案在Java 8中有些过时。

java.time

Java 8及更高版本附带java.time框架。这些新类取代了最早的Java版本(如java.util.Date/)附带的有缺陷的麻烦的日期时间类。Calendar 和 java.text.SimpleDateFormat.该框架由JSR 310定义,灵感来自Joda-Time,由ThreeTen-Extra项目扩展。

java.time 中的类解析为纳秒,比旧的日期时间类和 Joda-Time 使用的毫秒要精细得多。而且比问题中提出的微秒更精细。

enter image description here

Clock实现

虽然 java.time 类支持以纳秒为单位表示值的数据,但这些类尚未生成以纳秒为单位的值。这些方法使用与旧日期时间类 System.currentTimeMillis() 相同的旧时钟实现。我们在java.time中有新接口,但该接口的实现是相同的旧毫秒时钟。now()Clock

因此,您可以设置 结果的文本表示格式,以查看小数秒的九位数字,但只有前三位数字将具有如下数字:ZonedDateTime.now( ZoneId.of( "America/Montreal" ) )

2017-12-23T12:34:56.789000000Z

Java 9 中的新时钟

Java 9 的 OpenJDK 和 Oracle 实现具有更精细粒度的新默认实现,最高可达 java.time 类的全部纳秒级功能。Clock

请参阅 OpenJDK 问题,提高 java.time.Clock.systemUTC() 实现的精度。这个问题已经得到成功解决。

2017-12-23T12:34:56.123456789Z

在搭载 macOS Sierra 的 MacBook Pro(视网膜,15 英寸,2013 年末)上,我以微秒为单位获得当前时刻(最多六位小数)。

2017-12-23T12:34:56.123456Z

硬件时钟

请记住,即使使用新的更精细的实现,您的结果也可能因计算机而异。Java依赖于底层计算机硬件的时钟来了解当前时刻。Clock

  • 硬件时钟的分辨率差异很大。例如,如果特定计算机的硬件时钟仅支持微秒粒度,则任何生成的日期时间值将只有六位小数秒,最后三位数字为零。
  • 硬件时钟的精度差异很大。仅仅因为时钟生成一个具有几位十进制分数的值,这些数字可能是不准确的,只是近似值,偏离了可能从原子钟读取的实际时间。换句话说,仅仅因为你在小数点标记的右边看到一堆数字,并不意味着你可以相信这些读数之间的经过时间是真实的。