在 LocalDate 和 sql.Date 之间转换 [重复]
Posted
技术标签:
【中文标题】在 LocalDate 和 sql.Date 之间转换 [重复]【英文标题】:Convert between LocalDate and sql.Date [duplicate] 【发布时间】:2015-06-27 08:29:59 【问题描述】:在 Java 8(或更高版本)中,在 java.sql.Date
和 LocalDate
(双向)之间转换的正确方法是什么?
【问题讨论】:
问题本身的措辞对于那些也/专门寻找从 java.sql.Date 转换为 java.time.LocalDate 的人来说是好的,即使其他问题有类似的答案。 【参考方案1】:java.sql.Date
的 Java 8 版本(及更高版本)内置了对LocalDate
的支持,包括toLocalDate
和valueOf(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