java.util.Date
作为输入,然后使用它创建查询-所以我需要java.sql.Date
。 我很惊讶地发现它不能隐式或显式地进行转换-但我什至不知道该怎么做,因为Java API对我来说还很新。 br />
#1 楼
tl; dr如何将java.util.Date转换为java.sql.Date?
不要。这两个类均已过时。
使用java.time类代替具有JDBC 4.2或更高版本的旧版
java.util.Date
和java.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.Date
,Calendar
和SimpleDateFormat
。要了解更多信息,请参见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中添加内容打下了基础。您可能会在这里找到一些有用的类,例如
Interval
,YearWeek
,YearQuarter
等。评论
“虽然应该避免使用旧的日期时间类,但是在使用现有代码时可能会被迫这样做。如果是这样,则可以与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
评论
您可以在此处找到类似的问题stackoverflow.com/questions/12131068/…对我来说,事实证明我不需要转换。我的代码中有一个导入java.sql。*,它覆盖了java.util.date,因此在分配对后者(而不是第一个)合适的日期值时造成麻烦。 HTH
@DavidAckerman您知道java.util.Date是日期和时间,但是java.sql.Date只是没有时间的日期吗? (实际上有一天的时间,但是会被忽略,这是对类设计的错误处理)。在SQL中,DATE表示仅日期。
我的确没有意识到'09的细微差别,并且由于这个问题如此流行,因此我将可接受的答案更改为既现代又完整的答案。感谢大家的投入!