从我的数据库中我检索值如下:
20-DEC-17 10.15.53.000000000 AM
我想要上面的java.sql.Timestamp
转换为即时时间:
2017-12-20T10:15:53Z
我尝试使用当前时间戳
Timestamp ts2 = new Timestamp(date1.getTime());
Date tradeDate1=new Date(ts2.getTime());
Instant tradeInstant = tradeDate1.toInstant();
System.out.println("Tade Instant"+ tradeInstant);
- 实际时间戳:
Fri Jun 22 16:07:35 IST 2018
- 即时打印是什么:
Tade Instant2018-06-22T10:37:35.420Z
The hours/mins/seconds
更新了我不想要的-有没有办法可以按原样保留?
我假设您至少使用 Java 8 和 JDBC 4.2。我进一步假设时间戳在数据库中没有时区或偏移信息,但应理解为 UTC 时间戳(这是推荐的做法)。在这种情况下,我认为在 Java 中显式添加有关 UTC 偏移量的信息是最安全的:
PreparedStatement yourPreparedStatement
= yourConnection.prepareStatement("select trade_timestamp from your_table");
ResultSet rs = yourPreparedStatement.executeQuery();
while (rs.next()) {
LocalDateTime tradeDateTime = rs.getObject(1, LocalDateTime.class);
Instant tradeInstant = tradeDateTime.atOffset(ZoneOffset.UTC).toInstant();
System.out.println("Trade Instant: " + tradeInstant);
}
请注意,该代码避免了过时的Timestamp
完全上课。 ALocalDateTime
是没有时区或偏移量的日期和时间。如果您的数据库数据类型是timestamp with time zone
,你可能已经通过了Instant.class
or OffsetDateTime.class
to rs.getObject
并有一个Instant
or an OffsetDateTime
后退。 JDBC 4.2 仅指定支持OffsetDateTime
,但是很多驱动都支持Instant
也。显然与Instant
您不需要进一步转换。和OffsetDateTime
do
Instant tradeInstant = tradeDateTime.toInstant();
根据您的数据库及其功能,您还可以将 UTC 设置为数据库会话上的偏移量/时区,这样即使从timestamp
没有时区。
讨论:Arvind Kumar Avinash 在评论中建议应该只依赖 JDBC 4.2 官方支持的类型,即LocalDateTime
and OffsetDateTime
为了我们的目的。文章底部提到了类型为什么我们需要一个新的日期和时间库?在 Oracle 网站上,底部有一个链接。 Arvind Kumar Avinash 进一步向我们提到PSQLException:无法推断用于 java.time.Instant 实例的 SQL 类型,也链接到底部。由于评论很脆弱,我想在答案中包含要点。
你的代码出了什么问题?
看来您的数据库会话将时间戳理解为您当地时区的日期和时间(IST,我假设它是印度标准时间(存在其他解释))。根据 Mark Rotteveel 的信息性评论,这种行为是 JDBC 所要求的,但当值采用 UTC 时,它不符合您的需要。因此,尽管打印时看起来是正确的,但它给出的时间点是错误的。转换本身是正确的。
Links
-
Oracle 教程:日期时间解释如何使用 java.time。
- 为什么我们需要一个新的日期和时间库?
-
PSQLException:无法推断用于 java.time.Instant 实例的 SQL 类型。在 doobie 的 GitHub 页面上(doobie 是 Scala 的 JDBC 层)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)