当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何将java.util.Date转换为java.sql.Date?》经验,为你挑选了7个好方法。

我试图使用java.util.Date输入,然后用它创建一个查询 - 所以我需要一个java.sql.Date.

我很惊讶地发现它无法隐式或显式地进行转换 - 但我甚至不知道如何做到这一点,因为Java API对我来说仍然是一个新手.



1> David Ackerm..:

没关系....

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


这不是一个明确的转换!来自Javadoc:"如果给定的毫秒值包含时间信息,则驱动程序将时间组件设置为默认时区(运行应用程序的Java虚拟机的时区)中与零GMT对应的时间." 因此,无论您在java.util.Date上的时间是多少,它都将在00:00:00插入到数据类型设置为DATE的列中.
在我的情况下,正确的答案是 java.sql.Timestamp sqlTimestamp = new java.sql.Timestamp(utilDate.getTime()); ,因为它保留了时间字段.
@ 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.Datejava.sql.DateJDBC 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规范,则应该能够将存储上的LocalDatevia 传递到SQL DATE字段.setObjectPreparedStatement

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.Datajava.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;
    }

推荐阅读
我我檬檬我我186
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有