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

标签 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)));
执行于 Java 8 (corretto 1.8.0_232) 打印:
true
true
相反 Java 11 (corretto 11.0.0.5_10) 打印:
true
false
所以我的问题是:为什么会发生这种情况,它是否记录在某处?

最佳答案

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

This clock is based on the best available system clock. This may use System.currentTimeMillis(), or a higher resolution clock if one is available.


OpenJDK 11 uses a higher resolution clock ,因此返回 Instant带有纳秒部分。 Date只有毫秒精度,所以它在两者之间转换时隐式地截断 Instant 。
您可以通过调用 Instant.now().truncatedTo(ChronoUnit.MILLIS) 在 JDK 8 和 11 中获得等效的行为。 ,或使用 Clock#tickMillis

关于java - Instant 和 Date 之间的转换是否从 Java 8 更改为 11?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69032912/

相关文章:

java - 无法弄清楚如何将 String 转换为 int?

java - 排序程序: What is the next step?

java - 如何将 Java 枚举转换为流?

java-8 - 与流 API 交换实现后 Junit 测试失败,为什么?

java - 调用 @Singleton bean 的方法

database - 即使数据库失败如何运行 Spring Boot 应用程序

java - super() 是 class2 的第一行,但给出了非法的类型开始

java - 如何在hibernate中使用CreateSqlQuery查询不同的数据库?

java - Java 11 中的 JAX-WS 和缺少 WebParam$Mode 类

maven - IntelliJ 和 Visual Studio Code 中的 JavaFX 11 开发