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

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

【问题讨论】:

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

标签: java date java-8 java-time converters


【解决方案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,并在数据库中最终得到了昨天的日期值跨度>
猜你喜欢
  • 2015-06-28
  • 2020-07-05
  • 2016-08-14
  • 2013-08-07
  • 2016-12-15
  • 2016-01-09
  • 2017-06-09
  • 1970-01-01
相关资源
最近更新 更多