【问题标题】:Convert java.sql.date to java.time.LocalDateTime将 java.sql.date 转换为 java.time.LocalDateTime
【发布时间】:2017-07-13 20:11:25
【问题描述】:

如何将从 JDBC 数据库返回的 java.sql.Date 转换为 java.time.LocalDateTime

【问题讨论】:

标签: java


【解决方案1】:

实际上比我想象的要容易。 这对我有用:

//java.sql.ResultSet result
result.getTimestamp("value").toLocalDateTime()

【讨论】:

  • 这是一个合理的答案,对于 hibernate-java8 库跳过转换。现在可能是更好的方法。
  • 这不仅是合理的,而且是正确和简单的。然而,LocalDateTime 实际上是在 1.8(Java 8)中引入的。在接收端转换为 joda-time 前身(过去是 Java 早期版本中事实上的标准(外部)时间库),例如通过使用 DateTime 构造函数。
  • 这里的结果指的是什么对象类型? (java.sql.Date 上没有 getTimestamp() 方法。)
  • 我没有有问题的代码,但我假设 java.sql.ResultSet docs.oracle.com/javase/7/docs/api/java/sql/ResultSet.html
【解决方案2】:

工作方式:

public LocalDate convertToLocalDateViaMilisecond(Date dateToConvert) {
    return Instant.ofEpochMilli(dateToConvert.getTime())
      .atZone(ZoneId.systemDefault())
      .toLocalDate();
}

java.sql.Date 的非工作构建(因为它为 instant() 方法抛出 UnsupportedOperationException):

public LocalDate convertToLocalDateViaInstant(Date dateToConvert) {
    return dateToConvert.toInstant()
      .atZone(ZoneId.systemDefault())
      .toLocalDate();
}

感谢baeldung 在他的网站上回答这个问题:

【讨论】:

  • if (date instanceof java.sql.Date) date = new Date(date.getTime());
【解决方案3】:

如果您使用的是 Java 8 和 Hibernate 5,则无需从 java.sql.Date 转换为 java.sql.Date,只需要相信 Java 的魔力。

你需要使用的依赖是:

<dependency>
  <groupId>org.hibernate</groupId>
  <artifactId>hibernate-java8</artifactId>
  <version>5.1.0.Final</version>
</dependency>

如果您使用的是 spring-boot,则无需声明任何额外的依赖项。

如果您使用的是以前版本的 Java,建议定义一个像这样的转换器:

@Converter(autoApply = true)
public class LocalDateAttributeConverter implements AttributeConverter<LocalDate, Date> {

  @Override
  public Date convertToDatabaseColumn(LocalDate locDate) {
    return (locDate == null ? null : Date.valueOf(locDate));
  }

  @Override
  public LocalDate convertToEntityAttribute(Date sqlDate) {
    return (sqlDate == null ? null : sqlDate.toLocalDate());
  }
}

您可以在此link 中找到更多关于在 Java 8 中使用 LocalDateTime 的信息,并在此 link 上找到有关此类转换器的更多信息。

【讨论】:

  • 这并不是问题的真正答案,而是添加第三方依赖项的建议。
  • @Martin,不一定,如果您使用的是 spring-boot,则不需要新的依赖项。也许你需要问自己,直接使用纯 jdbc 代替 jpa 是否正确
  • 是的。这仍然不是问题的答案,而是宗教。 JPA 有几个选项,有时没有太多抽象的 JDBC 实际上优于拉动像 Hibernate 这样的重依赖,无论它们是隐式声明还是显式声明。我不是判断的人,但一个问题应该在它自己的背景下回答,而不是根据个人喜好过滤。像这样的答案无助于社区理解代码,尤其是像“只相信 Java 的魔力”这样的措辞。
【解决方案4】:

一种可能的方法是先将其转换为 java.time.LocalDate,然后再转换为 java.time.LocalDateTime

sqlDate.toLocalDate().atStartOfDay()

您还可以使用 atTime() 函数指定特定时间

sqlDate.toLocalDate().atStartOfDay(hour, miniute, second)

【讨论】:

    猜你喜欢
    • 2011-08-29
    • 2013-01-27
    • 2016-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-22
    • 2013-04-17
    • 2019-10-20
    相关资源
    最近更新 更多