Instant 和 Date 之间的转换是否从 Java 8 更改为 11?

8hZ*_*WKA 4 java java-8 java-11

从 Java 8 更新到 11 时,我注意到以下差异,这可能会严重破坏逻辑流程:

鉴于以下代码

final Instant now = Instant.now();
System.out.println(now.minusNanos(1).isBefore(now));
System.out.println(Date.from(now.minusNanos(1)).before(Date.from(now)));
Run Code Online (Sandbox Code Playgroud)

Java 8 (corretto 1.8.0_232) 上执行打印:

true
true
Run Code Online (Sandbox Code Playgroud)

相反,Java 11 (corretto 11.0.0.5_10) 打印:

true
false
Run Code Online (Sandbox Code Playgroud)

所以我的问题是:为什么会发生这种情况,它是否记录在某处?

Mik*_*Hay 9

改变的是Instant.now(). 从Clock的文档中:

该时钟基于最佳可用系统时钟。这可以使用 System.currentTimeMillis()或更高分辨率的时钟(如果可用)。

OpenJDK 11 使用更高分辨率的 clock,因此返回Instant带有纳秒部分的 。Date只有毫秒精度,所以它在两者之间转换时隐式地截断 Instant 。

您可以通过调用Instant.now().truncatedTo(ChronoUnit.MILLIS)或使用Clock#tickMillis获得 JDK 8 和 11 中的等效行为