从我的数据库中检索值为:
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
- 什么是 instan 中的打印:
Tade Instant2018-06-22T10:37:35.420Z
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
类。LocalDateTime
是一天中没有时区或偏移量的日期和时间。如果您的数据库数据类型已timestamp with time zone
,则可以将Instant.class
或OffsetDateTime.class
传递给rs.getObject
,并得到一个Instant
或一个OffsetDateTime
。JDBC 4.2只指定了对OffsetDateTime
的支持,但许多驱动程序也支持Instant
。显然,有了Instant
,您不需要进一步的转换。与OffsetDateTime
一起做
Instant tradeInstant = tradeDateTime.toInstant();
根据您的数据库及其功能,您还可以在数据库会话上将 UTC 设置为偏移量/时区,这样即使没有时区timestamp
也可以获得正确的时刻。
讨论:Arvind Kumar Avinash 在评论中建议,应该只依赖 JDBC 4.2 正式支持的类型,即LocalDateTime
和OffsetDateTime
。这些类型在文章底部提到为什么我们需要一个新的日期和时间库?在Oracle 的网站上,底部有一个链接。Arvind Kumar Avinash进一步向我们推荐了PSQLException:无法推断用于java.time.Instant实例的SQL类型,也链接到底部。由于评论很脆弱,我想在答案中包含本质。
您的代码中出了什么问题?
似乎您的数据库会话将时间戳理解为本地时区的日期和时间(IST,我假设它是针对印度标准时间(存在其他解释((。根据 Mark Rotteveel 的信息性评论,JDBC 需要此行为,但当值为 UTC 时,它不符合您的需求。因此,它给了你错误的时间点,尽管当你打印它时它看起来是正确的。转换本身是正确的。
链接
- Oracle 教程:日期时间解释如何使用 java.time。
- 为什么我们需要一个新的日期和时间库?
- PSQLException:无法推断用于 java.time.Instant. 实例的 SQL 类型(doobie 是 Scala 的 JDBC 层(
根据关于不使用 SimpleDateFormat 的评论,我已移至 DateTimeFormatter:
Date today = new Date();
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss") // same format
.withLocale(Locale.UK) // UK locale
.withZone(ZoneId.systemDefault());
String output = dateTimeFormatter.format( today.toInstant() );
System.out.println( output );
跑步可以让你:
2018-06-22T14:14:26
我创建了一个SimpleDateFormat,它最多只能打印"几秒钟":
/* simple date format */
DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
/* get toInstant() and convert to date */
Date myDate = Date.from(today.toInstant());
/* myDate formatted using DATE_FORMAT */
String formattedDate = DATE_FORMAT.format(myDate);
System.out.println(formattedDate);