【问题标题】:Has conversion between Instant and Date changed from Java 8 to 11?Instant 和 Date 之间的转换是否从 Java 8 更改为 11?
【发布时间】:2021-09-02 15:11:33
【问题描述】:

从 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)));

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

true
true

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

true
false

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

【问题讨论】:

标签: java java-8 java-11


【解决方案1】:

改变的是Instant.now() 的输出。来自Clock的文档:

此时钟基于最佳可用系统时钟。这可能会使用 System.currentTimeMillis(),如果可用,则可以使用更高分辨率的时钟。

OpenJDK 11 uses a higher resolution clock,因此返回一个带有纳秒部分的InstantDate 只有毫秒精度,所以在两者之间转换时会隐式截断 Instant。

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

【讨论】:

    猜你喜欢
    • 2016-11-26
    • 1970-01-01
    • 1970-01-01
    • 2021-05-25
    • 2023-03-22
    • 2020-07-26
    • 1970-01-01
    • 1970-01-01
    • 2019-10-27
    相关资源
    最近更新 更多