发布日期:2018-03-26
怎么把java.util.Data转换成java.sql.Data?+ 查看更多
怎么把java.util.Data转换成java.sql.Data?
+ 查看更多
发布日期:2018-03-08 17:59
分类:JAVA
浏览次数:296
我输入java.util.Data并想用他进行查询,所以我需要java.sql.Data。
我发现他俩之间不能进行隐式或显式的转换,但是因为我对Java API还不太熟,所以还不知道该怎么做。
我发现他俩之间不能进行隐式或显式的转换,但是因为我对Java API还不太熟,所以还不知道该怎么做。
回答
如果你只想使用日期值(没有时间,没有时区),就使用LocalDate类而不是java.util.Date。
java.time
在Java 8以及朝后版本,java.time.package取代了以往Java版本中的繁琐的时间类。参阅Oracle教程,大部分功能已经被ThreeTen-Backport的Java 6和7支持,并进一步适用于ThreeTenABP中的Android。一个SQL data typeDATE就是只有日期,没有时间和时区。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 driver遵守JDBC 4.2 spec,你可以用PreparedStatement通过setObject把LocalDate存到SQL DATE区。
把新方法加到老的类中去转换,例如,java.util.Date.from( Instant ) 和java.util.Date::toInstant.
myPreparedStatement.setObject( 1 , localDate );同样的,使用getObject提取SQL DATE个数存到Java LocalDate对象中
LocalDate localDate = myPreparedStatement.getObject( 1 );
换句话说,这整个问题在JDBC 4.2或更高版本都是无关紧要的。
如果你的JDBC驱动器不能实现这种方式,你需要追溯到去转换java.sql类型。
如果你的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。通过Instance类,可以展现UTC时间表上的某一时刻。Instance想法上和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类表面上是没有时间的日期,但实际上是一个时间,只是调整为午夜时间。 混乱? 是的,旧的日期时间类是很乱。