【问题标题】:Parsing mysql date to ZonedDateTime将 mysql 日期解析为 ZonedDateTime
【发布时间】:2023-03-09 19:04:01
【问题描述】:

我正在尝试以以下格式解析来自 MySql 的数据:

DATE_FORMAT(datetime,'%m-%d-%Y %H:%i')

Java 解析器代码如下所示:

ZonedDateTime datetime = ZonedDateTime
                    .parse(
                            row[1].toString(), 
                            DateTimeFormatter
                                    .ofPattern("MM-dd-YYYY hh:mm")
                                    .withZone(ZoneId.of("Etc/GMT"))
                    );

线程“AWT-EventQueue-0”java.time.format.DateTimeParseException 中的异常:无法解析文本“06-08-2017 04:15”:无法从 TemporalAccessor 获取 ZonedDateTime:{MinuteOfHour=15, DayOfMonth =8, WeekBasedYear[WeekFields[SUNDAY,1]]=2017, MonthOfYear=6, HourOfAmPm=4},ISO,Etc/GMT of type java.time.format.Parsed

有没有更好/更短的方法来完成这项工作?

【问题讨论】:

  • 将其读取为java.sql.Date,并将其转换为ZonedDateTime
  • 并非您从数据库中读取的所有内容都必须以字符串形式出现。 Sql 有原生的日期时间类型,你绝对应该使用它们。
  • Elliott,java.sql.Date 中没有时间组件
  • 在使用像java.sql.Date 和朋友这样过时的类之前,请检查您是否拥有或可以获得可以为您提供现代类实例的JDBC 驱动程序,例如ZonedDateTimeInstant (需要 JDBC 4.2 合规性,所以我读过)。

标签: java mysql datetime-parsing zoneddatetime


【解决方案1】:

您的问题的本地修复是:

    ZonedDateTime datetime = LocalDateTime.parse(row[1].toString(), 
                    DateTimeFormatter.ofPattern("MM-dd-uuuu HH:mm"))
            .atZone(ZoneOffset.UTC);

请注意,我已将您的格式模式中的YYYY 更改为uuuuhh 为大写HH

编辑:我在这里吃得太饱了。只需对格式模式进行这两项更改,您自己的 Java 代码就可以很好地工作。我会保留我的代码版本,以防任何人从中获得灵感。

也就是说,最好的解决方案是从您的 JDBC 驱动程序中获取一个 Instant 对象,而不是在数据库端格式化并在 Java 端解析回的字符串。一个 JDBC 4.2 兼容的驱动程序应该能够为您提供。

【讨论】:

  • 这就是我最终做的: ZonedDateTime dt = ZonedDateTime.ofInstant(rs.getTimestamp("datetime").toInstant(), UTCZONEID)
  • 这看起来比您之前尝试的工作方式有所改进。更清晰更简单。我喜欢它的另一件事是您获得的java.sql.Timestamp,您使用它做的第一件事就是将其转换为Instant,以便最大限度地减少您对旧类的使用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-13
  • 2016-06-26
  • 1970-01-01
  • 2020-12-15
相关资源
最近更新 更多