【问题标题】:Oracle Timestamp value is not converting to the java datetimeOracle 时间戳值未转换为 java 日期时间
【发布时间】:2020-04-22 06:55:39
【问题描述】:

我有一个返回日期时间列的 Oracle 数据库查询。在 java 方法中,将列转换为字符串。 部分代码如下所示:

ResultSet rs;
HashMap<String, String> hm=new HashMap<String, String> ();
 hm.put("SchEndDate2", rs1.getString("END_DT_TM_GMT"));

当我在调试器中查看字符串值时,它看起来像这样:"2019-07-04 11:00:00.0" 我需要将此字符串转换为以下日期时间格式:“yyyy-MM-dd'T'HH:mm”

我尝试使用此 SimpleDateFormat 来完成此操作,但是当我将字符串转换为格式时,它会返回东部夏令时的日期时间,而不是 GMT。 通过转换后的值是这样的:"Thu Jul 04 07:00:00 EDT 2019" 这是我用来将字符串转换为 DateTime 的代码。

  EndDate=map.get("SchEndDate2");
//EndDate : **"2019-07-04 11:00:00.0"**
    SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS");
    formatter.setTimeZone(TimeZone.getTimeZone("GMT"));
    Date databaseDateTime = formatter.parse(EndDate);
//databaseDateTime: **"Thu Jul 04 07:00:00 EDT 2019"**

为什么格式不正确,时区设置不正确?

【问题讨论】:

  • 我建议你不要使用SimpleDateFormatTimeZoneDate。这些类设计不佳且过时已久,尤其是第一个类是出了名的麻烦。相反,只需使用来自java.time, the modern Java date and time APILocalDateTime
  • 嗯?它已经是java.sql.Timestamp。不要将其转换为字符串,也不要将其转换回来。使用rs.getTimestamp()

标签: java datetime


【解决方案1】:

尝试将Date 对象转换为Instant。这是一个示例,显示您的输入字符串首先转换为Date,然后将其转换为Instant。日期包含特定于时区的渲染,但即时不包含。

String input = "2019-07-04 11:00:00.0";
System.out.println("input:   " + input);

SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
formatter.setTimeZone(TimeZone.getTimeZone("GMT"));
Date date = formatter.parse(input);
System.out.println("date:    " + date);

Instant instant = date.toInstant();
System.out.println("instant: " + instant);

这是输出:

input:   2019-07-04 11:00:00.0
date:    Thu Jul 04 05:00:00 MDT 2019
instant: 2019-07-04T11:00:00Z

【讨论】:

  • 是的......做到了!谢谢
【解决方案2】:

两点。

  1. 不要从 Oracle 获取您的日期和时间作为字符串。获取适当的日期时间对象。在这种情况下,LocalDateTime
  2. 请勿使用SimpleDateFormatTimeZoneDate。这些类设计不佳且早已过时,尤其是第一个类是出了名的麻烦。使用 java.time,现代 Java 日期和时间 API。

在代码中:

    ResultSet rs = // …;
    LocalDateTime dateTime = rs.getObject("END_DT_TM_GMT", LocalDateTime.class);

    String databaseDateTimeAsString = dateTime.toString();

    System.out.println(databaseDateTimeAsString);

示例输出:

2019-07-04T11:00

这不是您要求的输出格式,但它很可能会满足您的目的。您要求的格式是 ISO 8601。我给您的输出也是如此。在 ISO 8601 标准中,当它们为 0 时,包括秒和秒的小数部分是可选的。如果您坚持包含它们,请使用格式化程序。例如:

    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ss.SSS");
    String databaseDateTimeAsString = dateTime.format(formatter);

2019-07-04T11:00:00.000

使用rs.getObject() 获取LocalDateTime 需要符合JDBC 4.2 的数据库驱动程序。你可能已经明白了。如果您还没有并且无法升级,请使用:

    LocalDateTime dateTime = rs.getTimestamp("END_DT_TM_GMT").toLocalDateTime();

链接

【讨论】:

    猜你喜欢
    • 2016-06-07
    • 2018-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-26
    • 2020-10-19
    • 2022-01-14
    相关资源
    最近更新 更多