当前位置: 首页 > 面试题库 >

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

饶滨海
2023-03-14
问题内容

在我正在开发的应用程序中,我需要将java.time.Instantobject
转换为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对象呢?


问题答案:

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



 类似资料:
  • 当我这样创作的时候: 一切都工作得很好,但我尽量避免转换。是否可以通过只使用对象来实现这一点?

  • 在某些情况下,日期是错误的。有什么建议吗?

  • 有没有一种方法可以将转换为? 我有以下代码: 但是时间戳构造函数似乎不支持该变量类型。

  • 问题内容: 将Joda时间迁移到Java 8 乔达: 迁移至Java 8 这是我的代码;它确实可以编译;我怀疑它是否有效: 在某些情况下,日期是错误的。有什么建议吗? 问题答案: 这似乎可行:

  • 问题内容: 我正在使用JodaTime 1.6.2。 我有一个需要转换为(Joda)或进行映射的a。 原因是我想出了如何在a 和a 之间进行转换: 因此,如果我可以在和之间进行转换,则可以继续转换为。感谢您朝着正确的方向前进! 问题答案: 乔达时间 要将JodaTime转换为,只需执行 要将JodaTime转换为,只需执行 Java时间 要将Java8转换为,只需执行 要将Java8转换为,只需执

  • 我有一个格式为“2019-04-25T16:34:28-05:00”的字符串。我已经通过模式“yyyy-mm-dd't'hh:mm:ssz”通过joda-time解析了字符串。 它在DateTime中给出的输出是“2019-04-25t15:34:28.000-06:00”。