为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

素胚勾勒不出你 2019-06-18 15:05:04
如何将java.util.Date转换为java.sql.Date?我试着用java.util.Date作为输入,然后使用它创建一个查询-所以我需要一个java.sql.Date.我惊讶地发现,它不能隐式或显式地进行转换-但我甚至不知道该如何做,因为JavaAPI对我来说仍然是相当新的。
查看完整描述

3 回答

?
侃侃无极

TA贡献2051条经验 获得超10个赞

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

别。这两门课都过时了。

  • 使用

    java.time

    类而不是遗留类

    java.util.Date & java.sql.Date

    使用JDBC 4.2或更高版本。
  • 如果与尚未更新的代码进行互操作,则转换为/从java.time转换为java.time。

示例查询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.)

替代者:

  • Instant

    而不是

    java.util.Date

    两者都代表了世界协调时的一个时刻。但是现在只有纳秒而不是毫秒。
  • LocalDate

    而不是

    java.sql.Date

    这两种方法都表示一个日期纯值,不包括一天中的某个时间,也没有一个时区.

细节

如果您试图使用仅限日期的值(没有一天的时间,也没有时区),请使用LocalDate类而不是java.util.Date.


java.time

在Java 8和更高版本中,与Java早期版本捆绑在一起的麻烦的旧日期时间类已经被新的java.time包..看见Oracle教程..中的大部分功能都已移植到Java 6和7中。Threeten-Backport并进一步适应了ThreeTenABP.

SQL数据类型 DATE意味着只有约会,没有时间,没有时区。JAVA从来没有过这样一个类†,直到java.time.LocalDate在Java 8中,让我们根据特定的时区获取今天的日期来创建这样的值(例如,在确定日期时,时区在巴黎比Montréal更早)。

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规范,您应该能够通过LocalDate通孔setObject在.上PreparedStatement若要存储到SQL日期字段中,请执行以下操作。

myPreparedStatement.setObject( 1 , localDate );

同样,使用ResultSet::getObject从SQLDate列获取到JavaLocalDate对象。在第二个参数中指定类将使您的代码类型安全.

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

换句话说,在JDBC4.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();

要确定日期,我们需要时区的上下文。在任何特定时刻,全球各地的日期都会因时区而异。应用aZoneId得到一个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.DateCalendar, & SimpleDateFormat.

这个尤达-时间项目,现在在维护模式,建议迁移到java.time上课。

若要了解更多信息,请参见Oracle教程..并搜索堆栈溢出的许多例子和解释。规格是JSR 310.

你们可以交换java.time对象直接使用数据库。用JDBC驱动程序符合JDBC 4.2或者晚些时候。不需要字符串,不需要字符串java.sql.*上课。

在哪里获得java.time类?

这个三次-额外项目使用其他类扩展java.time。这个项目是java.time将来可能添加的一个试验场。您可能会在这里发现一些有用的类,例如IntervalYearWeekYearQuarter,和更多.


查看完整回答
反对 回复 2019-06-18
  • 3 回答
  • 0 关注
  • 1288 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信