当前位置: 首页 > 知识库问答 >
问题:

转换java。sql。时间戳到即时时间

何安宜
2023-03-14

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

20-DEC-17 10.15.53.000000000 AM

我想要上面的java。sql。要转换为即时时间的时间戳

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);
  • 实际时间戳:2018年6月22日星期五16:07:35

hours/mins/seconds更新了,我不想更新,有没有办法保持原样?

共有3个答案

宰鸿博
2023-03-14

我创建了一个SimpleDataFormat,它只打印“最多几秒钟”:

/* 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);
秦才
2023-03-14

从关于不使用SimpleDateFormat的评论构建,我已经移动到DateTimeForall:

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
曾山
2023-03-14

我假设您至少使用Java8和至少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);
}

请注意,该代码完全避免了过时的时间戳类。LocalDateTime是一天中没有时区或偏移的日期和时间。如果您的数据库数据类型是带有时区的时间戳,那么您可能传递了Instant。类偏移日期时间。类到rs.getObject,并获得了一个即时偏移日期时间返回。JDBC 4.2只指定了对OffsetDateTime的支持,但许多驱动程序也支持即时。显然,使用Instant无需进一步转换。使用OffsetDateTimedo

    Instant tradeInstant = tradeDateTime.toInstant();

根据您的数据库及其功能,您也可以将UTC设置为数据库会话上的偏移/时区,这样即使没有时区,您也可以从时间戳中获得正确的即时信息。

讨论:Arvind Kumar Avinash在评论中建议,我们应该仅依赖JDBC 4.2正式支持的类型,即LocalDateTimeOffsetDateTime。类型在文章的底部提到了为什么我们需要一个新的日期和时间库?在甲骨文的网站上,底部有一个链接。Arvind Kumar Avinash进一步向我们介绍了PSQLExc0019:无法推断java.time.Instant实例使用的SQL类型,也链接到底部。由于评论是脆弱的,我想在回答中包含这里的本质。

似乎您的数据库会话将时间戳理解为本地时区的日期和时间(IST,我假设它是印度标准时间(存在其他解释))。根据Mark Rotteveel的详细评论,JDBC需要这种行为,但当值处于UTC时,它不符合您的需要。因此,它给了你错误的时间点,尽管你打印它的时候看起来是对的。转换本身是正确的。

  • Oracle教程:解释如何使用java的日期时间。时间到了
  • 为什么我们需要一个新的日期和时间库
  • PSQLException:无法推断用于java实例的SQL类型。时间瞬间在doobie的GitHub页面上(doobie是Scala的JDBC层)
 类似资料:
  • 我找不到这个问题的解决方案,我正在从firebase获取数据,其中一个字段是时间戳,看起来像这样- Swift示例(作品): 我的飞镖尝试: 并且它返回的日期/时间是错误的。 更新:

  • 问题内容: 我尝试将其转换为java.sql.Timestamp后插入,并使用以下代码段: 但是,这是给我的 有没有办法在没有毫秒的情况下获得输出? 问题答案: 您可以使用来减少毫秒数: 输出:

  • 但问题是我无法将数据从Firebase转换为Local。save方法将转换为Timestamp fine。 任何解决办法。

  • 问题内容: 我有一个数据库,它将具有标准sql格式的UMT时间戳。如何提取数据并为其设置Java日期对象? 据我所知mysql是 至于Java,日期/时间的东西一直躲着我。 如果有人为此知道一个好的图书馆,我欢迎您提出建议。 问题答案: 为什么不直接阅读为 看到

  • 本文向大家介绍sqlite时间戳转时间语句(时间转时间戳),包括了sqlite时间戳转时间语句(时间转时间戳)的使用技巧和注意事项,需要的朋友参考一下 下面是具体的实现代码:

  • 我需要能够将从存储在“日期时间”字段中的MySQL数据库中获取的数据转换为Java对象。 我遇到的问题是将本地时间偏移量添加到对象,我不需要它,因为日期时间已经以UTC格式存储在数据库中。所以当我运行以下代码时: 我得到: 我需要时间部分保持不变。 我找不到任何明显的解决问题的方法,所以我在这里错过了什么吗?