【问题标题】: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

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

【问题讨论】:

  • 因为时间过去了……
  • 嗯,它不是在完全相同的时间调用的。不是吗?
  • 顺便说一句,没有必要将现代 java.time 类 Instant 与麻烦笨拙的类 java.sql.Timestamp 混在一起。 java.time 类之外的所有日期时间类现在都是遗留的,应该避免使用。 myPreparedStatement.setObject( … , myInstant )myResultSet.getObject( … , Instant.class )
  • “即使它们同时被调用?” - 你为什么这么认为?那句话没有逻辑。

标签: java date time java-time


【解决方案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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-06-12
        • 1970-01-01
        • 2016-07-31
        • 2020-03-11
        • 1970-01-01
        相关资源
        最近更新 更多