如何将java.util.Date转换为java.sql.Date?tl;博士详java.time转换为 java.sql.Date转换自java.util.Date 关于 java.time

2022-08-31 04:24:38

我正在尝试使用java.util.Date作为输入,然后使用它创建一个查询 - 所以我需要一个java.sql.Date

我很惊讶地发现它不能隐式或显式地进行转换 - 但我甚至不知道我会如何做到这一点,因为Java API对我来说仍然是相当新的。


答案 1

没关系。。。。

public class MainClass {

  public static void main(String[] args) {
    java.util.Date utilDate = new java.util.Date();
    java.sql.Date sqlDate = new java.sql.Date(utilDate.getTime());
    System.out.println("utilDate:" + utilDate);
    System.out.println("sqlDate:" + sqlDate);

  }

}

解释它。链接已 http://www.java2s.com/Tutorial/Java/0040__Data-Type/ConvertfromajavautilDateObjecttoajavasqlDateObject.htm


答案 2

tl;博士

如何将java.util.Date转换为java.sql.Date?

不要。

这两个类都过时了。SunOracleJCP 社区在几年前就放弃了这些遗留的日期时间类,一致采用 JSR 310 来定义 java.time 类。Date

  • 使用java.time类而不是legacy & JDBC 4.2或更高版本。java.util.Datejava.sql.Date
  • 如果与尚未更新到 java.time 的代码相互操作,则转换为 java.time。
遗产 摩登 转换
java.util.Date java.time.Instant java.util.Date.toInstant()
java.util.Date.from( Instant )
java.sql.Date java.time.LocalDate java.sql.Date.toLocalDate()
java.sql.Date.valueOf( LocalDate )

使用预准备语句的示例查询。

myPreparedStatement.setObject( 
    … ,                                         // Specify the ordinal number of which argument in SQL statement.
    myJavaUtilDate.toInstant()                  // Convert from legacy class `java.util.Date` (a moment in UTC) to a modern `java.time.Instant` (a moment in UTC).
        .atZone( ZoneId.of( "Africa/Tunis" ) )  // Adjust from UTC to a particular time zone, to determine a date. Instantiating a `ZonedDateTime`.
        .toLocalDate()                          // Extract a date-only `java.time.LocalDate` object from the date-time `ZonedDateTime` object.
)

更换:

  • 即时而不是
    两者都表示 UTC 中的某个时刻。但现在用纳秒而不是毫秒。java.util.Date
  • LocalDate(而不是
    两者)表示仅日期值,不带一天中的时间和时区。java.sql.Date

如果尝试使用纯日期值(没有时间、没有时区),请使用 LocalDate 类而不是 java.util.Date

Table of date-time types in Java (both legacy and modern) and in the SQL standard.

java.time

在Java 8及更高版本中,与Java早期版本捆绑在一起的麻烦的旧日期时间类已被新的java.time包所取代。请参阅 Oracle 教程。大部分功能已经移植到ThreeTen-Backport中的Java 6和7,并在ThreeTenABP中进一步适应Android。

SQL 数据类型应为仅日期,没有时间,也没有时区。Java从来没有这样的类†直到Java 8中的java.time.LocalDate。让我们通过根据特定时区获取今天的日期来创建这样的值(例如,时区对于确定日期非常重要,因为巴黎的新一天比蒙特利尔更早)。DATE

LocalDate todayLocalDate = LocalDate.now( ZoneId.of( "America/Montreal" ) );  // Use proper "continent/region" time zone names; never use 3-4 letter codes like "EST" or "IST".

在这一点上,我们可能就完成了。如果您的 JDBC 驱动程序符合 JDBC 4.2 规范,那么您应该能够在 PreparedStatement 上传递一个 via setObject 以存储到 SQL DATE 字段中。LocalDate

myPreparedStatement.setObject( 1 , localDate );

同样,使用 ResultSet::getObject 从 SQL DATE 列提取到 Java 对象。在第二个参数中指定类可使代码类型安全LocalDate

LocalDate localDate = ResultSet.getObject( 1 , LocalDate.class );

换句话说,整个问题在 JDBC 4.2 或更高版本下无关紧要

如果您的 JDBC 驱动程序不以这种方式执行,则需要回退到转换为 java.sql类型。

转换为 java.sql.Date

若要进行转换,请使用添加到旧日期时间类的新方法。我们可以调用 java.sql.Date.valueOf(...) 来转换 .LocalDate

java.sql.Date sqlDate = java.sql.Date.valueOf( todayLocalDate );

然后朝另一个方向走。

LocalDate localDate = sqlDate.toLocalDate();

转换自java.util.Date

虽然应避免使用旧的日期时间类,但在使用现有代码时可能会被迫使用。如果是这样,您可以转换为/从java.time转换。

遍历该类,该类表示 UTC 时间轴上的某个时刻。An 在思想上与 .但请注意,分辨率高达纳秒,而分辨率仅为毫秒。InstantInstantjava.util.DateInstantjava.util.Date

若要进行转换,请使用添加到旧类的新方法。例如,java.util.Date.from( Instant )java.util.Date::toInstant

Instant instant = myUtilDate.toInstant();

要确定日期,我们需要时区的上下文。在任何给定的时刻,日期在全球范围内因时区而异。应用 ZoneId 以获取 ZonedDateTime

ZoneId zoneId = ZoneId.of ( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.ofInstant ( instant , zoneId );
LocalDate localDate = zdt.toLocalDate();

† java.sql.Date 类假装只有日期,没有一天中的时间,但实际上做了一个时间,调整为午夜时间。混乱?是的,旧的日期时间类是一团糟。


关于 java.time

java.time 框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧日期时间类,如java.util.DateCalendarSimpleDateFormat

要了解更多信息,请参阅 Oracle 教程。搜索 Stack Overflow 以获取许多示例和解释。规格是JSR 310

Joda-Time 项目现在处于维护模式,建议迁移到 java.time 类。

您可以直接与数据库交换 java.time 对象。使用符合 JDBC 4.2 或更高版本的 JDBC 驱动程序。不需要字符串,不需要类。Hibernate 5 & JPA 2.2 支持 java.timejava.sql.*

从哪里获取 java.time 类?

Table of which java.time library to use with which version of Java or Android

ThreeTen-Extra 项目通过其他类扩展了 java.time。这个项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如IntervalYearWeekYearQuarter