我正在尝试使用java.util.Date作为输入,然后使用它创建查询-所以我需要java.sql.Date

我很惊讶地发现它不能隐式或显式地进行转换-但我什至不知道该怎么做,因为Java API对我来说还很新。 br />

评论

您可以在此处找到类似的问题stackoverflow.com/questions/12131068/…

对我来说,事实证明我不需要转换。我的代码中有一个导入java.sql。*,它覆盖了java.util.date,因此在分配对后者(而不是第一个)合适的日期值时造成麻烦。 HTH

@DavidAckerman您知道java.util.Date是日期和时间,但是java.sql.Date只是没有时间的日期吗? (实际上有一天的时间,但是会被忽略,这是对类设计的错误处理)。在SQL中,DATE表示仅日期。

我的确没有意识到'09的细微差别,并且由于这个问题如此流行,因此我将可接受的答案更改为既现代又完整的答案。感谢大家的投入!

#1 楼

tl; dr

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

不要。这两个类均已过时。

使用java.time类代替具有JDBC 4.2或更高版本的旧版java.util.Datejava.sql.Date
如果与尚未更新的代码互操作,则转换为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.time软件包已取代了与早期Java版本捆绑在一起的麻烦的旧日期时间类。请参阅Oracle教程。许多功能已在ThreeTen-Backport中反向移植到Java 6和7,并在ThreeTenABP中进一步适应了Android。
SQL数据类型DATE只能是日期,没有时间。而且没有时区。直到Java 8中出现java.time.LocalDate为止,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上的setObject传递PreparedStatement来存储到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。一天,调整为午夜时间。令人困惑?是的,旧的日期时间类是一团糟。

关于java.time

java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧式传统日期时间类,例如java.util.DateCalendarSimpleDateFormat
要了解更多信息,请参见Oracle教程。并在Stack Overflow中搜索许多示例和说明。规范是JSR310。
现在处于维护模式的Joda-Time项目建议迁移到java.time类。
您可以直接与数据库交换java.time对象。使用与JDBC 4.2或更高版本兼容的JDBC驱动程序。不需要字符串,不需要java.sql.*类。 Hibernate 5和JPA 2.2支持java.time。




Java SE 8,Java SE 9,Java SE 10,Java SE 11和更高版本-标准Java API的一部分,具有捆绑的实现。


Java 9带来了一些次要功能和修复。




Java SE 6和Java SE 7

大多数java.time功能都在ThreeTen-Backport中反向移植到Java 6和7。



Android

以后版本(26+)的java.time类的实现的捆绑实现。 br />
如果退缩没有满足您的需求,ThreeTenABP项目会将ThreeTen-Backport(如上所述)改编为Android。请参见如何使用ThreeTenABP…。






ThreeTen-Extra项目使用其他类扩展了java.time。该项目为将来可能在java.time中添加内容打下了基础。您可能会在这里找到一些有用的类,例如IntervalYearWeekYearQuarter等。

评论


“虽然应该避免使用旧的日期时间类,但是在使用现有代码时可能会被迫这样做。如果是这样,则可以与java.time进行相互转换。”其实没有实际上,这和Date.valueOf()在JDBC / Java7范例中不可用。

–sf_jeff
8月17日下午1:28

@sf_jeff我的答案结尾的项目符号中包含Java 7支持:在哪里获取java.time类?

–罗勒·布尔克
8月19日在23:01



@Brain重读转换为…和转换为…部分。要与尚未更新到java.time的旧代码进行互操作,请在java.time中进行业务逻辑处理。通过调用添加到旧类中的新方法,可以在现代类型和传统类型之间进行转换。对于java.sql.Date,请参见toLocalDate和valueOf(LocalDate)方法。切勿使用旧类编写新代码。

–罗勒·布尔克
9月24日21:59



#2 楼

没关系。...

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虚拟机的时区)中的时间,该时间对应于格林尼治标准时间零。因此,无论您在java.util.Date上花费的时间如何,它都将作为00:00:00插入数据类型设置为DATE的列中。

–user4903
2012年4月12日19:43在

@David Ackerman .....此方法返回1970年1月1日之后的毫秒数。但是,如果我们想将某人的日期存储在该日期之前。

– Arjun K P
2012年6月27日17:27

在我的情况下,正确的答案是 java.sql.Timestamp sqlTimestamp = new java.sql.Timestamp(utilDate.getTime()); ,因为它保留了时间字段。

–阿尔贝托·德保拉
2012年9月3日23:05

@ wired00是的,与Java早期版本捆绑在一起的旧的日期时间类是一团糟,设计糟糕,包括一些粗暴的hacks。尽可能尝试在Java 8及更高版本中使用新的java.time框架。这些新的阶级取代了旧的阶级。 java.time类和旧类具有一些来回转换的便捷方法-在我们等待JDBC驱动程序更新以直接利用新的java.time类型时有用。

–罗勒·布尔克
2015年7月6日在3:52



@ wired00有关如何使用java.time,请参阅有关此问题的新答案。还要搜索StackOverflow以获取更多示例。

–罗勒·布尔克
2015年7月6日下午5:01

#3 楼

使用其他答案,您可能会在时间信息方面遇到麻烦(将日期与意外结果进行比较!)

我建议:

评论


如果他使用java.sql.Date作为数据库中的Date列,则该时间信息将被截断。我认为您对解决方案进行了过度设计。

–达里奥
2010年11月4日在14:12

是的,也许我做到了。有时我需要将java.sql.Data与当前日期进行比较,恕我直言,这是最好的方法。希望对您有所帮助。

– mauretto
2010年11月9日,9:14

仅供参考,现在麻烦的旧日期时间类非常麻烦,例如java.util.Date,java.util.Calendar和java.text.SimpleDateFormat,已被内置在Java 8及更高版本中的java.time类取代。请参见Oracle教程。

–罗勒·布尔克
18/12/31在0:38

当然,这个主题大约在10年前的Java 8之前。

– mauretto
19年1月8日在8:21

#4 楼

此函数将从Java日期对象返回转换后的SQL日期。

public java.sql.Date convertJavaDateToSqlDate(java.util.Date date) {
    return new java.sql.Date(date.getTime());
}


#5 楼

java.util.Data转换为java.sql.Data将浪费小时,分钟和秒。因此,如果可能的话,我建议您使用java.sql.Timestamp,例如:

#6 楼

在我从JXDatePicker(Java日历)中选择日期并将其作为SQL Date类型存储在数据库中的情况下,下面的方法很好..

java.sql.Date date = new java.sql.Date(pickedDate.getDate().getTime());

其中pickedDate是对象JXDatePicker

#7 楼

此函数将从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;
    }


#8 楼

首先格式化java.util.Date。然后使用格式化的日期在java.sql.Date中获取日期。

java.util.Date utilDate = "Your date"
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
final String stringDate= dateFormat.format(utilDate);
final java.sql.Date sqlDate=  java.sql.Date.valueOf(stringDate);


#9 楼

java.sql.Date sqlDate = new java.sql.Date(javaDate.getTime());


javaDate是java.util.Date的实例

评论


与David Ackerman,chetan和Tanmay kumar shaw的答案相比,它似乎并没有增加任何新内容,是吗?

– Ole V.V.
19年8月7日在14:49

#10 楼

在这里,将Util Date转换为Sql date和ya的示例,这也是我在项目中使用的一个示例,对您也可能会有帮助。

java.util.Date utilStartDate = table_Login.getDob();(orwhat ever date your give form obj)
java.sql.Date sqlStartDate = new java.sql.Date(utilStartDate.getTime());(converting date)


#11 楼

我是新手:经过大量运行后,此方法可行。思想可能有用

     String bufDt =  bDOB.getText();  //data from form
     DateFormat dF = new SimpleDateFormat("dd-MM-yyyy"); //data in form is in this format
     Date bbdt = (Date)dF.parse(bufDt);  // string data is converted into java util date
     DateFormat dsF = new SimpleDateFormat("yyyy-MM-dd"); //converted date is reformatted for conversion to sql.date
     String ndt = dsF.format(bbdt); // java util date is converted to compatible java sql date
     java.sql.Date sqlDate=  java.sql.Date.valueOf(ndt);  // finally data from the form is convered to java sql. date for placing in database


评论


仅供参考,现在麻烦的旧日期时间类非常麻烦,例如java.util.Date,java.util.Calendar和java.text.SimpleDateFormat,已被内置在Java 8及更高版本中的java.time类取代。请参见Oracle教程。

–罗勒·布尔克
18-12-31 at 0:37

#12 楼

比较2个日期(util.date或sql.date)的方法

 public static boolean isSameDay(Date a, Date b) {
    Calendar calA = new GregorianCalendar();
    calA.setTime(a);

    Calendar calB = new GregorianCalendar();
    calB.setTime(b);

    final int yearA = calA.get(Calendar.YEAR);
    final int monthA = calA.get(Calendar.MONTH);
    final int dayA = calA.get(Calendar.DAY_OF_YEAR);

    final int yearB = calB.get(Calendar.YEAR);
    final int monthB = calB.get(Calendar.MONTH);
    final int dayB = calB.get(Calendar.DAY_OF_YEAR);

    return yearA == yearB && monthA == monthB && dayA == dayB;
}


#13 楼

尝试使用此

public static String toMysqlDateStr(Date date) {
    String dateForMySql = "";
    if (date == null) {
        dateForMySql = null;
    } else {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        dateForMySql = sdf.format(date);
    }

    return dateForMySql;
}


#14 楼

我认为最好的转换方法是:

static java.sql.Timestamp SQLDateTime(Long utilDate) {
    return new java.sql.Timestamp(utilDate);
}

Date date = new Date();
java.sql.Timestamp dt = SQLDateTime(date.getTime());


如果要将dt变量插入到SQL表中,可以执行以下操作:

insert into table (expireAt) values ('"+dt+"');


评论


这似乎与一年前发布的答案基本相同。

– Bernhard Barker
17年5月5日在20:15

#15 楼

我正在使用以下代码,请尝试一下

DateFormat fm= new SimpleDateFormatter();


指定所需日期的格式
例如"DD-MM_YYYY"'YYYY-mm-dd',然后使用java Date数据类型as

fm.format("object of java.util.date");


,它将解析您的日期

#16 楼

您可以使用此方法将使用日期转换为sql日期,


评论


标准Java库中没有DateUtilities类(而且我什至无法通过快速Google搜索在任何地方找到此方法)。如果这是来自特定库,则可能要多说一些,并包括指向文档的链接。

– Bernhard Barker
17年11月5日在20:08



#17 楼

我正在尝试以下运行良好的编码。


java.util.Date utilDate = new java.util.Date(); java.sql.Date
sqlDate =新的java.sql.Date(utilDate);


#18 楼

如果您使用的是Mysql,则可以将日期列传递给该日期的字符串表示形式

,因此我可以使用DateFormatter类对其进行格式化,然后在sql语句或prepared语句中将其设置为String
这是代码插图:

private String converUtilDateToSqlDate(java.util.Date utilDate) {
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
    String sqlDate = sdf.format(utilDate);
    return sqlDate;
}


字符串日期= converUtilDateToSqlDate(otherTransaction.getTransDate());

/ /然后在您的sql语句中传递此日期

评论


欢迎来到stackoverflow,对于您的回答,我有一些评论。问题是“如何将java.util.Date转换为java.sql.Date”。您粘贴的代码将java.util.Date格式化为yyyy-MM-dd。实际上,这种方法在这种情况下用途有限,因为您应该将java.sql.Date直接传递给jdbc驱动程序,而不是将其作为字符串进行传递。

– jontro
2012年6月25日在22:19