我将计算机的时区更改为欧洲/布加勒斯特进行实验。这是 UTC + 2 小时,就像您的时区一样。
现在,当我复制您的代码时,我会得到与您类似的结果:
Instant now = Instant.now();
System.out.println(now); // prints 2017-03-14T06:16:32.621Z
Timestamp current = Timestamp.from(now);
System.out.println(current); // 2017-03-14 08:16:32.621
输出在评论中给出。但是,我继续说:
DateFormat df = DateFormat.getDateTimeInstance();
df.setTimeZone(TimeZone.getTimeZone("UTC"));
// the following prints: Timestamp in UTC: 14-03-2017 06:16:32
System.out.println("Timestamp in UTC: " + df.format(current));
现在您可以看到Timestamp
与我们一开始的真正一致Instant
(只有毫秒没有打印,但我相信它们也在那里)。所以你做的一切都是正确的,只是感到困惑,因为当我们打印时,Timestamp
我们隐含地调用了它的toString
方法,而这个方法又会获取计算机的时区设置并显示该时区的时间。正因为如此,显示器才不同。
您尝试使用的另一件事LocalDateTime
似乎可以工作,但它实际上并没有给您想要的东西:
LocalDateTime ldt = LocalDateTime.ofInstant(Instant.now(), ZoneOffset.UTC);
System.out.println(ldt); // 2017-03-14T06:16:32.819
current = Timestamp.valueOf(ldt);
System.out.println(current); // 2017-03-14 06:16:32.819
System.out.println("Timestamp in UTC: " + df.format(current)); // 14-03-2017 04:16:32
现在,当我们Timestamp
使用 UTC打印时DateFormat
,我们可以看到太早了 2 小时,04:16:32 UTC,而 UTC 时间Instant
是 06:16:32。所以这个方法是骗人的,它看起来很有效,但实际上并没有。
这显示了导致设计 Java 8 日期和时间类以替换旧的类的麻烦。因此,真正解决您的问题的好方法可能是让自己获得一个可以轻松接受Instant
对象的 JDBC 4.2 驱动程序,这样您就可以避免Timestamp
完全转换为。我不知道你现在是否可以使用,但我相信它会的。