如何将java.util.Date转换为java.sql.Date?tl;博士详java.time转换为 java.sql.Date转换自java.util.Date 关于 java.time
我正在尝试使用java.util.Date
作为输入,然后使用它创建一个查询 - 所以我需要一个java.sql.Date
。
我很惊讶地发现它不能隐式或显式地进行转换 - 但我甚至不知道我会如何做到这一点,因为Java API对我来说仍然是相当新的。
我正在尝试使用java.util.Date
作为输入,然后使用它创建一个查询 - 所以我需要一个java.sql.Date
。
我很惊讶地发现它不能隐式或显式地进行转换 - 但我甚至不知道我会如何做到这一点,因为Java API对我来说仍然是相当新的。
没关系。。。。
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);
}
}
如何将java.util.Date转换为java.sql.Date?
不要。
这两个类都过时了。Sun、Oracle 和 JCP 社区在几年前就放弃了这些遗留的日期时间类,一致采用 JSR 310 来定义 java.time 类。Date
java.util.Date
java.sql.Date
遗产 | 摩登 | 转换 |
---|---|---|
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.
)
更换:
如果尝试使用纯日期值(没有时间、没有时区),请使用 LocalDate
类而不是 java.util.Date
。
在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.valueOf(...)
来转换 .LocalDate
java.sql.Date sqlDate = java.sql.Date.valueOf( todayLocalDate );
然后朝另一个方向走。
LocalDate localDate = sqlDate.toLocalDate();
java.util.Date
虽然应避免使用旧的日期时间类,但在使用现有代码时可能会被迫使用。如果是这样,您可以转换为/从java.time转换。
遍历该类,该类表示 UTC 时间轴上的某个时刻。An 在思想上与 .但请注意,分辨率高达纳秒,而分辨率仅为毫秒。Instant
Instant
java.util.Date
Instant
java.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 8 及更高版本中。这些类取代了麻烦的旧旧日期时间类,如java.util.Date
,Calendar
和SimpleDateFormat
。
要了解更多信息,请参阅 Oracle 教程。搜索 Stack Overflow 以获取许多示例和解释。规格是JSR 310。
Joda-Time 项目现在处于维护模式,建议迁移到 java.time 类。
您可以直接与数据库交换 java.time 对象。使用符合 JDBC 4.2 或更高版本的 JDBC 驱动程序。不需要字符串,不需要类。Hibernate 5 & JPA 2.2 支持 java.time。java.sql.*
从哪里获取 java.time 类?
ThreeTen-Extra 项目通过其他类扩展了 java.time。这个项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如Interval
,YearWeek
,YearQuarter
等。