在 java 中,当前时间(以微秒为单位)tl;博士详java.time
在Unix系统上,有没有办法在Java中获得具有微秒级精度的时间戳?类似于 C 的函数。gettimeofday
在Unix系统上,有没有办法在Java中获得具有微秒级精度的时间戳?类似于 C 的函数。gettimeofday
不,Java没有这种能力。
它确实有System.nanoTime(),但这只是给出了一些以前已知的时间的偏移。因此,虽然您无法从中获取绝对数字,但您可以使用它来测量纳秒(或更高)精度。
请注意,JavaDoc表示,虽然这提供了纳秒级精度,但这并不意味着纳秒级精度。因此,取一些适当大的返回值模量。
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 8及更高版本附带java.time框架。这些新类取代了最早的Java版本(如java.util.Date/)附带的有缺陷的麻烦的日期时间类。Calendar 和 java.text.SimpleDateFormat.该框架由JSR 310定义,灵感来自Joda-Time,由ThreeTen-Extra项目扩展。
java.time 中的类解析为纳秒,比旧的日期时间类和 Joda-Time 使用的毫秒要精细得多。而且比问题中提出的微秒更精细。
Clock
实现虽然 java.time 类支持以纳秒为单位表示值的数据,但这些类尚未生成以纳秒为单位的值。这些方法使用与旧日期时间类 System.currentTimeMillis()
相同的旧时钟实现。我们在java.time中有新接口,但该接口的实现是相同的旧毫秒时钟。now()
Clock
因此,您可以设置 结果的文本表示格式,以查看小数秒的九位数字,但只有前三位数字将具有如下数字:ZonedDateTime.now( ZoneId.of( "America/Montreal" ) )
2017-12-23T12:34:56.789000000Z
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