首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >从Oracle中选择UTC日期并在Java中转换为UTC

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

Stack Overflow用户
提问于 2018-09-13 23:47:26
回答 1查看 1.1K关注 0票数 3

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

System.currentTimeMillis()

结果将是,比方说: 1536842771599,,即:GMT:星期四,2018年9月13日12:46:11.599 PM或在我当地的:2018年9月13日星期四3:46:11.599 PM GMT+03:00 DST

如果在本地安装的Oracle数据库上执行以下select操作:

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

我通过以下JdbcTemplate代码获得:

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

结果如下:

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

myResult.getTime()

为了获得long值,这将把我的时间从大约下午12:46转换为值1536831971599,实际上是: GMT:星期四,2018年9月13日9:46:11.599 AM

这显然不是很好,因为它比我的实际本地时间晚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。如果我在此时间戳实例上调用getTime,我将获得一个长值,如果我将其放入https://www.epochconverter.com/中,则会得到2018年9月14日星期五上午8:26:06或2018年9月14日星期五上午5:26:06,这恰好比我作为GMT+03:00实际拥有的时间晚了3个小时!

P.S.2我使用Spring JDBC 4.2.5-RELEASE。不能对它使用Instant,它抛出异常,无法将时间戳转换为Instant,因为它需要从Number派生的内容。不幸的是,我现在不能更改这个JDBC,甚至是版本。

EN

回答 1

Stack Overflow用户

发布于 2018-09-13 23:51:05

tl;dr

您误解了java.sql.Timestamp类。

的某个时刻

只使用Instant,不要使用Timestamp

Instant

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

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

JDBC 4.2

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

取回。

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

插入。

myPreparedStatement.setObject( … , instant ) ;

时间戳通常表示本地化时间。

不正确。java.sql.Timestamp表示协调时的时刻,根据定义,总是协调时。同样,Instant也代表了协调世界时的一个时刻。这两个类都表示自1970年UTC的第一个时刻以来的计数。

关于java.time

框架内置于Java8和更高版本中。这些类取代了麻烦的旧legacy日期时间类,如java.util.DateCalendarSimpleDateFormat

现在在maintenance mode中的项目建议迁移到java.time类。

要了解更多信息,请参阅。和搜索堆栈溢出,以获得许多示例和解释。规范为JSR 310

您可以直接与数据库交换java.time对象。使用与JDBC 4.2或更高版本兼容的JDBC driver。不需要字符串,也不需要java.sql.*类。

从哪里获取java.time类?

  • ,、、和更高版本-标准Java API的一部分,具有捆绑的实现。
    • Java9添加了一些次要功能和fixes.

  • 和.

中的

  • 大多数java.time功能已向后移植到Java6和7

    • 更高版本的Android捆绑实现的java.time类。
    • 对于较早的Android (<26),项目适配 (如上所述)。请参阅.

项目使用额外的类扩展了java.time。这个项目是未来可能添加到java.time中的试验场。您可能会在这里找到一些有用的类,如IntervalYearWeekYearQuartermore

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52317359

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档