在我正在开发的应用程序中,我需要将 java.time.Instant
对象转换为 java.sql.Timestamp
。当我创建 Instant
对象时:
Instant now = Instant.now();
我收到类似 2017-03-13T14:28:59.970Z
的信息。当我尝试创建 Timestamp
对象时,如下所示:
Timestamp current = Timestamp.from(now);
我收到类似 2017-03-13T16:28:59.970Z
的信息。结果相同,但延迟了 2 小时。有人可以解释为什么会发生这种情况并为我提供解决此问题的答案而不会拖延吗?
当我这样创建时:
LocalDateTime ldt = LocalDateTime.ofInstant(Instant.now(), ZoneOffset.UTC);
Timestamp current = Timestamp.valueOf(ldt);
一切正常,但我尽量避免转换。有没有办法只使用 Instant
对象来做到这一点?
原文由 Aleydin Karaimin 发布,翻译遵循 CC BY-SA 4.0 许可协议
我将计算机的时区更改为 Europe/Bucharest 进行实验。这是 UTC + 2 小时,就像您的时区一样。
现在,当我复制您的代码时,我得到的结果与您的类似:
输出在注释中给出。但是,我继续:
现在您可以看到
Timestamp
真的与我们开始的Instant
--- 一致(只有毫秒未打印,但我相信它们也在那里)。所以你已经正确地完成了所有事情,只是感到困惑,因为当我们打印Timestamp
时,我们隐式调用了它的toString
方法,而这个方法反过来获取计算机的时区设置并显示在这个区域的时间。仅此而已,显示有所不同。你尝试的另一件事,使用
LocalDateTime
,似乎有效,但它确实没有给你你想要的东西:现在,当我们使用我们的 UTC
DateFormat
打印Timestamp
时,我们可以看到它早了 2 小时,04:16:32 UTC 当Instant
世界标准时间 06:16:32。所以这个方法是骗人的,貌似有效,其实不然。这显示了导致设计 Java 8 日期和时间类以替换旧类的麻烦。因此,解决您的问题的真正和好的解决方案可能是让您自己拥有一个 JDBC 4.2 驱动程序,它可以轻松接受
Instant
对象,这样您就可以避免转换为Timestamp
。我不知道你现在是否可以使用它,但我相信它会的。