为啥 Instant 在彼此之后打印时显示不同的值? [关闭]

Posted

技术标签:

【中文标题】为啥 Instant 在彼此之后打印时显示不同的值? [关闭]【英文标题】:Why does Instant display different values when printed after eachother? [closed]为什么 Instant 在彼此之后打印时显示不同的值? [关闭] 【发布时间】:2018-06-19 15:22:09 【问题描述】:

为什么下面的代码在打印出来时会返回两个不同的Instant 值?

Timestamp currentTime = Timestamp.from(Instant.now());

System.out.println(currentTime.toInstant());
System.out.println(Instant.now());

上面两行同时打印出来的时候,会给我:

2018-01-10T12:22:46.168Z

2018-01-10T12:22:46.236Z

为什么打印的输出不一样,即使它们被同时调用?

【问题讨论】:

因为时间过去了…… 嗯,它不是在完全相同的时间调用的。不是吗? Time keeps on slippin', slippin', slippin'… Into the future — 史蒂夫·米勒乐队 顺便说一句,没有必要将现代 java.time 类 Instant 与麻烦笨拙的类 java.sql.Timestamp 混在一起。 java.time 类之外的所有日期时间类现在都是遗留的,应该避免使用。 myPreparedStatement.setObject( … , myInstant )myResultSet.getObject( … , Instant.class ) “即使它们同时被调用?” - 你为什么这么认为?那句话没有逻辑。 【参考方案1】:

每次调用System.currentTimeMillis()Instant.now() 等 API 时,都会采用调用时的准确值。

时间在每条指令处流逝。您的处理器由 Java 虚拟机驱动,一条又一条指令执行代码,这需要一些时间。

在计算机科学中没有什么是瞬时的,而你刚刚发现了这一点。

【讨论】:

【参考方案2】:

Instant.now() 的每次调用都会返回一个新的Instant 实例,其中包含不同的时间,因为时间在两次调用之间传递。

如果您使用相同的实例,您将看到相同的输出:

Instant now = Instant.now();
Timestamp currentTime = Timestamp.from(now);
System.out.println(currentTime.toInstant());
System.out.println(now);

【讨论】:

【参考方案3】:

Instant.now() 调用您的操作系统,然后读取硬件时钟以获取当前时间。这些操作需要时间,而且时间通常比预期的要长。 68 毫秒(两次之间的差异)听起来并不合理。

顺便说一句,Basil Bourque 在his comment 中是正确的,当您可以使用现代的Instant 类时,没有理由也应该使用过时的Timestamp

【讨论】:

以上是关于为啥 Instant 在彼此之后打印时显示不同的值? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

为啥我在自定义单元格中的复选框在快速选择和滚动时显示不同的行为?

手机日历封面为啥不同时显示当天日期

如何在编译时显示 #define 的值?

为啥我用vs2012编完c语言之后调试时显示“无法启动程序,系统找不到指定文件”?

如何在选择集合视图单元格时显示不同的视图控制器

找回华为账号密码时为啥存在安全风险 找回华为账号密码时显示存在安全风险的原因