将java.sql.Timestamp转换为Instant Time



从我的数据库中检索值为:

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.classOffsetDateTime.class传递给rs.getObject,并得到一个Instant或一个OffsetDateTime。JDBC 4.2只指定了对OffsetDateTime的支持,但许多驱动程序也支持Instant。显然,有了Instant,您不需要进一步的转换。与OffsetDateTime一起做

Instant tradeInstant = tradeDateTime.toInstant();

根据您的数据库及其功能,您还可以在数据库会话上将 UTC 设置为偏移量/时区,这样即使没有时区timestamp也可以获得正确的时刻。

讨论:Arvind Kumar Avinash 在评论中建议,应该只依赖 JDBC 4.2 正式支持的类型,即LocalDateTimeOffsetDateTime。这些类型在文章底部提到为什么我们需要一个新的日期和时间库?在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);

相关内容

  • 没有找到相关文章

最新更新