在LocalDate和sql.Date之间转换

maj*_*aja 50 java date converter java-8 java-time

什么是之间进行转换的正确方法java.sql.DateLocalDate(Java8)?

maj*_*aja 102

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

要转换LocalDatejava.sql.Date你可以使用

java.sql.Date.valueOf( localDate );
Run Code Online (Sandbox Code Playgroud)

并转换java.sql.DateLocalDate:

sqlDate.toLocalDate();
Run Code Online (Sandbox Code Playgroud)

时区:

LocalDate类型存储任何时区信息,同时java.sql.Date做.因此,在使用上述转换时,结果取决于系统的默认时区(如注释中所指出).

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

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

  • 请注意,这使用系统默认时区来解释日期,这可能是您想要的,也可能不是.通常,最好明确指定时区! (4认同)
  • 不知何故,在那些 java.sql.Date 方法中,我进行了不需要的时区转换 - 我放入了今天的 LocalDate,并在数据库中最终得到了昨天的日期值 (3认同)
  • @marc82ch 你是对的。[默认时区会影响转换,正如这个问题所证明的那样](/sf/ask/2644559291/)。你可以在转换时使用 yyyy-mm-dd 格式:`java.time.LocalDate.parse(sqlDate.toString())` @maja,你能相应地更新你的答案吗? (2认同)
  • 替代方法不正确,因为java.sql.Date.toInstant()抛出UnsupportedOperationException(在Java 8中) (2认同)
  • 如果日期为java.util,则在java.util.Date中抛出UnsupportedOperationException,而不是在java.sql.Date中抛出Un以避免在此异常之前在sqlDate.toLocalDate()之前使用if(sqlDate instanceof java.sql.Date)。日期使用sqlDate.toInstant()。atZone(ZoneId.systemDefault())。toLocalDate(); (2认同)