tl;博士
Java 9 及更高版本:捕获当前时刻时分辨率高达nanoseconds。那是 9 位小数。
Instant.now()
2017-12-23T12:34:56.123456789Z
限制为microseconds、truncate。
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-23T12:34:56.123456Z
实际上,.now 仅捕获微秒,因为nanoseconds 中的当代传统计算机硬件时钟并不准确。
详情
从 Java 8 开始,其他答案有些过时了。
java.time
Java 8 及更高版本带有java.time 框架。这些新类取代了早期 Java 版本中存在缺陷的、麻烦的日期时间类,例如 java.util.Date/.Calendar 和 java.text.SimpleDateFormat。该框架由 JSR 310 定义,受Joda-Time 启发,由 ThreeTen-Extra 项目扩展。
java.time 中的类解析为 nanoseconds,比旧日期时间类和 Joda-Time 使用的 milliseconds 好得多。并且比问题中提出的microseconds 更好。
Clock 实现
虽然 java.time 类支持以纳秒为单位表示值的数据,但这些类尚未生成以纳秒为单位的值。 now() 方法使用与旧日期时间类 System.currentTimeMillis() 相同的旧时钟实现。我们在 java.time 中有新的Clock 接口,但该接口的实现是相同的旧毫秒时钟。
因此,您可以格式化 ZonedDateTime.now( ZoneId.of( "America/Montreal" ) ) 结果的文本表示形式,以查看小数秒的九位数字,但只有前三位数字具有如下数字:
2017-12-23T12:34:56.789000000Z
Java 9 中的新时钟
Java 9 的 OpenJDK 和 Oracle 实现具有新的默认 Clock 实现,具有更精细的粒度,最高可达 java.time 类的完整纳秒能力。
请参阅 OpenJDK 问题,Increase the precision of the implementation of java.time.Clock.systemUTC()。该问题已成功实施。
2017-12-23T12:34:56.123456789Z
在装有 macOS Sierra 的 MacBook Pro(Retina,15 英寸,2013 年末)上,我得到了以微秒为单位的当前时刻(最多六位小数)。
2017-12-23T12:34:56.123456Z
硬件时钟
请记住,即使使用新的更精细的Clock 实现,您的结果也可能因计算机而异。 Java 依靠底层计算机硬件的时钟来了解当前时刻。
- 硬件时钟的分辨率变化很大。例如,如果特定计算机的硬件时钟仅支持microseconds 粒度,则任何生成的日期时间值都将只有六位小数秒,最后三位为零。
- 硬件时钟的准确度差异很大。仅仅因为时钟生成的值具有几位秒的十进制小数,这些数字可能不准确,只是近似值,与可能从atomic clock 读取的实际时间有偏差。换句话说,仅仅因为您在小数点右侧看到一堆数字并不意味着您可以相信这些读数之间经过的时间在该分钟程度上是真实的。