我将计算机的时区更改为欧洲/布加勒斯特以进行实验。这是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,我们可以看到现在比格林尼治标准时间06:16:32早了2小时,
Instant即04:16:32
UTC。因此,这种方法具有欺骗性,看起来像在起作用,但事实并非如此。
这显示了导致Java
8日期和时间类的设计替换旧的麻烦。因此,解决您的问题的真正有效的解决方案可能是让自己得到一个可以轻松接受
Instant对象的JDBC
4.2驱动程序,从而避免
Timestamp完全转换为一个对象。我不知道该功能是否适用于您,但我相信它会提供。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)