Java-将java.time.Instant转换为java.sql.Timestamp,不带区域偏移

Java-将java.time.Instant转换为java.sql.Timestamp,不带区域偏移,第1张

Java-将java.time.Instant转换为java.sql.Timestamp,不带区域偏移

我将计算机的时区更改为欧洲/布加勒斯特以进行实验。这是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
完全转换为一个对象。我不知道该功能是否适用于您,但我相信它会提供。



欢迎分享,转载请注明来源:内存溢出

原文地址: http://www.outofmemory.cn/zaji/5499502.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-12
下一篇 2022-12-13

发表评论

登录后才能评论

评论列表(0条)

保存