gpt4 book ai didi

java - 从 Oracle 中选择 UTC 日期并在 Java 中转换为 UTC

转载 作者:行者123 更新时间:2023-11-30 06:43:14 26 4
gpt4 key购买 nike

如果我调用我的应用程序:

System.currentTimeMillis()

结果将是,比方说:1536842771599,这是:格林威治标准时间:2018 年 9 月 13 日星期四下午 12:46:11.599 或者在我的本地:星期四, 2018 年 9 月 13 日下午 3:46:11.599 GMT+03:00 DST

如果我在本地安装的 Oracle 数据库上执行以下选择:

select CAST(sys_extract_utc(SYSTIMESTAMP) AS DATE) from dual;

我通过下面的 JdbcTemplate 代码得到:

jdbc.queryForObject(sqlCommand, new Object[0], Timestamp.class);

结果如下: enter image description here

在我看来这已经是错误的,因为 Timestamp 通常代表本地时间。此外,如果我调用:

myResult.getTime()

为了获得长值,这会将我的时间(大约下午 12 点 46 分)转换为值 1536831971599,实际上是:GMT:2018 年 9 月 13 日,星期四,上午 9:46:11.599。

显然这不好,因为它比我的实际本地时间晚 2 * GMT+03:00(6 小时),比数据库的 UTC 时间晚 GMT+03:00(3 小时)。

我做错了什么?到目前为止,我唯一的结论是避免在数据库上执行 sys_extract_utc 并让数据库返回本地时间,当我在 Timestamp 实例上调用 getTime 时,本地时间将转换为 UTC 时间。

有什么解释吗?

附言基于 java.sql.Timestamp 是 UTC 的答案,我附上了调试器向我显示的屏幕截图,这是错误的,因为它认为 UTC 的结果是 GMT+03:00。所以,它显示我的时间为 8.26 + 03:00。我的本地时间是 11 点 26 分。如果我在这个 Timestamp 实例上调用 getTime,我将得到一个很长的值,如果我将其放入 https://www.epochconverter.com/ 中然后我得到 2018 年 9 月 14 日星期五 8:26:06 AM GMT+03:00 DST 或 2018 年 9 月 14 日星期五 5:26:06 AM 这比我实际拥有的 UTC 时间晚了 3 小时!

附言2我使用 Spring JDBC 4.2.5-RELEASE。不能将 Instant 与它一起使用,它会抛出无法将 Timestamp 转换为 Instant 的异常,因为它需要从 Number 派生的东西。不幸的是,我现在无法更改此 JDBC,甚至是版本。

enter image description here

最佳答案

tl;dr

你误解了 java.sql.Timestamp类(class)。

  • java.sql.Timestamp 始终代表 UTC 中的时刻。
  • java.time.Instant多年前替换了 Timestamp

仅使用Instant,从不使用Timestamp

即时

可怕的 java.sql.Timestamp 类现在已被 java.time 类淘汰,特别是 Instant

Instant.now()  // Capture the current moment in UTC. 

JDBC 4.2

从 JDBC 4.2 开始,我们可以直接与数据库交换 java.time 对象。无需再使用糟糕的 DateCalendar 或 java.sql 类。

检索。

Instant instant = myResultSet.getObject( … , Instant.class ) ;

插入。

myPreparedStatement.setObject( … , instant ) ;

Timestamp usually represents localized time.

不正确。 java.sql.Timestamp 表示 UTC 中的时刻,根据定义始终为 UTC。同样,Instant 也代表 UTC 中的一个时刻。这两个类都代表自 1970 年第一刻以来的 UTC 计数。


关于java.time

java.time框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧类 legacy日期时间类,例如 java.util.Date , Calendar , & SimpleDateFormat .

Joda-Time项目,现在在maintenance mode , 建议迁移到 java.time类。

要了解更多信息,请参阅 Oracle Tutorial .并在 Stack Overflow 中搜索许多示例和解释。规范为 JSR 310 .

您可以直接与您的数据库交换java.time 对象。使用JDBC driver符合 JDBC 4.2或以后。不需要字符串,不需要 java.sql.* 类。

从哪里获得 java.time 类?

ThreeTen-Extra项目用附加类扩展 java.time。该项目是 future 可能添加到 java.time 的试验场。您可能会在这里找到一些有用的类,例如 Interval , YearWeek , YearQuarter , 和 more .

关于java - 从 Oracle 中选择 UTC 日期并在 Java 中转换为 UTC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52317359/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com