Java 8 java 8中的LocalDateTime到java.sql.Date?

Java 8 java 8中的LocalDateTime到java.sql.Date?,java-8,java-time,datetime-conversion,Java 8,Java Time,Datetime Conversion,如何在中将LocalDateTime转换为java.sql.Date 我在互联网上的搜索主要是给我时间戳相关代码或LocalDate到java.sql.Date。我正在寻找LocalDateTime到java.sql.Date在LocalDateTime和java.sql.Date之间没有直接的相关性,因为前者是时间戳,后者是日期 但是,LocalDate和java.sql.Date之间存在一种关系,可以这样进行转换: LocalDate date = //your local date jav

如何在中将
LocalDateTime
转换为
java.sql.Date


我在互联网上的搜索主要是给我
时间戳
相关代码或
LocalDate
java.sql.Date
。我正在寻找
LocalDateTime
java.sql.Date

LocalDateTime
java.sql.Date
之间没有直接的相关性,因为前者是时间戳,后者是日期

但是,
LocalDate
java.sql.Date
之间存在一种关系,可以这样进行转换:

LocalDate date = //your local date
java.sql.Date sqlDate = java.sql.Date.valueOf(date)
对于任何给定的
LocalDateTime
,它都会为您提供以下代码:

LocalDateTime dateTime = // your ldt
java.sql.Date sqlDate = java.sql.Date.valueOf(dateTime.toLocalDate());
,我只想补充几点

java.sql.Date
只保留日、月和年的值。时间值(小时、分钟、秒和毫秒)。因此,当将
LocalDateTime
转换为
java.sql.Date
时,这些字段将丢失

如果您正在进行单向转换,并且不介意丢失这些字段,那么可以这样做:

LocalDateTime dt = // LocalDateTime value
// convert to Date (time information is lost)
java.sql.Date date = java.sql.Date.valueOf(dt.toLocalDate());
但是,如果要在以后恢复原始的
LocalDateTime
,最好单独保存时间字段,以便恢复:

LocalDateTime dt = // your LocalDateTime
// save time information (hour, minute, seconds, fraction of seconds)
LocalTime savedTime = dt.toLocalTime();
// convert to Date (time information is lost)
java.sql.Date date = java.sql.Date.valueOf(dt.toLocalDate());

// retrieve back the LocalDate (only day/month/year)
LocalDate localDate = date.toLocalDate();
// retrieve the LocalDateTime, with the original time values
LocalDateTime ldt = localDate.atTime(savedTime);

通过使用java.util.date作为中介,可以将LocalDateTime转换为java.sql.date,同时保留时间部分,而不必假设时区:

LocalDateTime dateValue = // your LocalDateTime
java.util.Date utilDate;
String dateFormat = "yyyy-MM-dd'T'HH:mm:ss";
DateTimeFormatter dtf1 = DateTimeFormatter.ofPattern(dateFormat);
SimpleDateFormat sdf1 = new SimpleDateFormat(dateFormat);
try {
    utilDate = sdf1.parse(dateValue.format(dtf1));
} catch (ParseException e) {
    utilDate = null; // handle the exception
}
java.sql.Date sqlDate = new java.sql.Date(utilDate.getTime());

此答案必须是此问题的正确答案+1.
java.sql.Date
中的时间值未设置为零-根本没有此类值。在OpenJDK中,在
java.sql.Date
上调用
getHours()
setSeconds(v)
会产生错误,甚至调用
toInstant()
也会产生错误。只有在调用
getTime()
java.Sql.Date时,这些值才会显示为零。此解决方案会导致时间部分丢失。@而且,这个问题是关于将DateTime转换为
Sql.Date
,显然它不关心保留时间。如果我们关心这一点,我们将转换为
sql.Timestamp
-该类支持时间组件(尽管已弃用),因此显然它可以/确实关心保留时间。一旦您在
sql.Date
上调用
getHours
,您可能会重新考虑它是否有时间。那里没有时间成分。它继承自
java.util.Date
这一事实对于JDK开发人员来说是一个非常不幸的错误。