在 LocalDate 和 sql.Date 之间转换 [重复]

Posted

技术标签:

【中文标题】在 LocalDate 和 sql.Date 之间转换 [重复]【英文标题】:Convert between LocalDate and sql.Date [duplicate] 【发布时间】:2015-06-27 08:29:59 【问题描述】:

在 Java 8(或更高版本)中,在 java.sql.DateLocalDate(双向)之间转换的正确方法是什么?

【问题讨论】:

问题本身的措辞对于那些也/专门寻找从 java.sql.Date 转换为 java.time.LocalDate 的人来说是好的,即使其他问题有类似的答案。 【参考方案1】:

java.sql.Date 的 Java 8 版本(及更高版本)内置了对LocalDate 的支持,包括toLocalDatevalueOf(LocalDate)

要将LocalDate 转换为java.sql.Date,您可以使用

java.sql.Date.valueOf( localDate );

以及从java.sql.Date 转换为LocalDate

sqlDate.toLocalDate();

时区:

LocalDate 类型不存储时区信息,而 java.sql.Date 存储。因此,使用上述转换时,结果取决于系统的默认时区(如 cmets 中所指出的)。

如果不想依赖默认时区,可以使用如下转换:

Date now = new Date();
LocalDate current = now.toInstant()
                       .atZone(ZoneId.systemDefault()) // Specify the correct timezone
                       .toLocalDate();

【讨论】:

请注意,这使用系统默认时区来解释日期,这可能是也可能不是您想要的。通常最好明确指定时区! @marc82ch 你是对的。 The default time zone affects the conversion, as proved by this question。您可以在转换时使用 yyyy-mm-dd 格式:java.time.LocalDate.parse(sqlDate.toString())@maja,您可以相应地更新您的答案吗? 替代方法不正确,因为 java.sql.Date.toInstant() 会抛出 UnsupportedOperationException(在 Java 8 中) UnsupportedOperationException 在 java.util.Date 中抛出,而不是在 java.sql.Date 中抛出,为避免此异常,请在 sqlDate.toLocalDate() 之前使用 if (sqlDate instanceof java.sql.Date),如果日期是 java.util.Date 使用 sqlDate.toInstant().atZone(ZoneId.systemDefault()).toLocalDate(); 在这些 java.sql.Date 方法中不知何故对我进行了不需要的时区转换 - 我输入了今天的 LocalDate,并在数据库中最终得到了昨天的日期值跨度>

以上是关于在 LocalDate 和 sql.Date 之间转换 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

java获取时间的几种方式Date VS LocalDate

java8 LocalDateTime/LocalDate/LocalTimejava.util.Date/java.sql.Date区别及日期转换方法

将通过 JDBC 检索到的 java.sql.Date 值转换为 java.time.LocalDate? [复制]

Mybatis无法使用localdate类java.lang.IllegalStateException: No typehandler found for property creationDate

在 LocalDate 和 XMLGregorianCalendar 之间转换

最新的 Spring Data/Hibernate 在本机查询中不支持 java.time.LocalDate?