我试图使用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); } }
解释它.链接是http://www.java2s.com/Tutorial/Java/0040__Data-Type/ConvertfromajavautilDateObjecttoajavasqlDateObject.htm
java.sql.Timestamp sqlTimestamp = new java.sql.Timestamp(utilDate.getTime()); code>,因为它保留了时间字段.
@ wired00是的,与早期版本的Java**捆绑的**旧日期时间类**是一个混乱**,设计糟糕,包括一些粗暴的黑客.尽可能尝试在Java 8及更高版本中使用新的[java.time框架](http://docs.oracle.com/javase/8/docs/api/java/time/package-summary.html).这些新课程取代了旧课程.java.time类和旧类有一些方便的来回转换 - 在我们等待JDBC驱动程序更新以直接利用新的java.time类型时非常有用.
2> Basil Bourqu..:
TL;博士
如何将java.util.Date转换为java.sql.Date?
别.这两个课程都过时了.
使用java.time类而不是legacy 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
两者代表UTC的时刻.但现在有纳秒而不是毫秒.
LocalDate
而不是java.sql.Date
两者都代表一个仅限日期的值,没有时间和没有时区.
细节
如果您尝试使用仅限日期的值(没有时间,没有时区),请使用LocalDate
该类而不是java.util.Date
.
java.time
在Java 8及更高版本中,与早期版本的Java捆绑在一起的麻烦的旧日期时间类已被新的java.time包取代.请参阅Oracle教程.许多功能已被后移植到Java 6和7在ThreeTen-反向移植并且还适于在到Android ThreeTenABP.
一个SQL数据类型 DATE
,就是要日期而已,没有时区没有时间的日和.java.time.LocalDate
在Java 8中,Java从未有过这样的类† .让我们通过根据特定时区获取今天的日期来创建这样的值(时区对于确定一个日期是重要的,因为新的一天在巴黎早些时候比蒙特利尔早,例).
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
via 传递到SQL DATE字段.setObject
PreparedStatement
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时间轴上的一个时刻.An Instant
在想法上类似于a 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.time框架是建立在Java 8和更高版本.这些类取代麻烦的老传统日期时间类,如java.util.Date
,Calendar
,和SimpleDateFormat
.
现在处于维护模式的Joda-Time项目建议迁移到java.time类.
要了解更多信息,请参阅Oracle教程.并搜索Stack Overflow以获取许多示例和解释.规范是JSR 310.
您可以直接与数据库交换java.time对象.使用符合JDBC 4.2或更高版本的JDBC驱动程序.不需要字符串,不需要课程.java.sql.*
从哪里获取java.time类?
Java SE 8, Java SE 9, Java SE 10及更高版本
内置.
带有捆绑实现的标准Java API的一部分.
Java 9增加了一些小功能和修复.
Java SE 6和 Java SE 7
许多java.time功能都被反向移植到ThreeTen-Backport中的 Java 6和7 .
Android的
更高版本的Android捆绑java.time类的实现.
对于早期的Android(<26),ThreeTenABP项目采用ThreeTen-Backport(如上所述).请参阅如何使用ThreeTenABP ....
该ThreeTen-额外项目与其他类扩展java.time.该项目是未来可能添加到java.time的试验场.您可以在此比如找到一些有用的类Interval
,YearWeek
,YearQuarter
,和更多.
3> mauretto..:
使用其他答案,您可能会遇到时间信息问题(将日期与意外结果进行比较!)
我建议:
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);
如果他将java.sql.Date用于数据库中的Date列,那么该时间信息将被截断.在我看来,你已经过度设计了解决方案.
是的,也许我做到了.我有时需要将java.sql.Data与当前日期和imho进行比较,这是最好的方法.我希望它可以提供帮助.
4> chetan..:
此函数将从java日期对象返回转换的SQL日期.
public java.sql.Date convertJavaDateToSqlDate(java.util.Date date) {
return new java.sql.Date(date.getTime());
}
5> shellbye..:
转换java.util.Data
为java.sql.Data
将丢失小时,分钟和秒.所以,如果有可能,我建议你这样使用java.sql.Timestamp
:
prepareStatement.setTimestamp(1, new Timestamp(utilDate.getTime()));
有关详细信息,您可以查看此问题.
6> jack jay..:
在我从JXDatePicker(java日历)中选择日期并将其作为SQL日期类型存储在数据库中的情况下,下面工作正常..
java.sql.Date date = new java.sql.Date(pickedDate.getDate().getTime());
其中pickedDate是JXDatePicker的对象
7> Tanmay kumar..:
此函数将从java日期对象返回转换的SQL日期.
public static java.sql.Date convertFromJAVADateToSQLDate(
java.util.Date javaDate) {
java.sql.Date sqlDate = null;
if (javaDate != null) {
sqlDate = new Date(javaDate.getTime());
}
return sqlDate;
}