如何将java.util.Date转换为java.sql.Date?
我想用java.util.Date
作为输入,然后用它创建一个查询 - 所以我需要一个java.sql.Date
。
我惊讶地发现它不能隐式或明确地进行转换 - 但我甚至不知道我会怎么做,因为Java API对我来说还是比较新的。
TL;博士
java.util.Date
& java.sql.Date
。 用PreparedStatement
查询示例。
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.time
在Java 8及更高版本中,与早期版本的Java捆绑在一起的麻烦的旧日期时间类已被新的java.time包取代。 请参阅Oracle教程。 大部分功能已被移植到ThreeTen-Backport中的Java 6和7,并进一步适用于ThreeTenABP中的Android。
SQL数据类型DATE
仅用于日期,没有时间和时区。 Java从来没有正确的类,直到Java 8中的java.time.LocalDate
。让我们通过根据特定时区获取今天的日期来创建这样的值(时区对于确定日期是重要的,因为在巴黎早些时候出现了新的日期比如在蒙特利尔)。
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
上的setObject
传递LocalDate
以存储到SQL DATE字段中。
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。
通过Instant
类,它表示UTC时间轴上的一个时刻。 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类假装为不带日期的日期,但实际上是按照每天的午夜时间调整的。 混乱? 是的,旧的日期时间课程是一团糟。
没关系....
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
与另一个答案,你可能有麻烦的时间信息(比较日期与意想不到的结果!)
我建议:
java.util.Calendar cal = Calendar.getInstance();
java.util.Date utilDate = new java.util.Date(); // your util date
cal.setTime(utilDate);
cal.set(Calendar.HOUR_OF_DAY, 0);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MILLISECOND, 0);
java.sql.Date sqlDate = new java.sql.Date(cal.getTime().getTime()); // your sql date
System.out.println("utilDate:" + utilDate);
System.out.println("sqlDate:" + sqlDate);
链接地址: http://www.djcxy.com/p/18515.html