3

我很惊讶java.sql.Date有一个方法toLocalDate()

java.util.Date或者java.time.Instant没有可比的方法。似乎在 中java.timeZoneId必须始终提供 a 以获得“LocalFoo”或“OffsetBar”。

来自的javadoc java.sql.Date#toLocalDate()

将此 Date 对象转换为 LocalDate。转换会创建一个 LocalDate,它表示与本地时区中此 Date 相同的日期值

哪个时区是“本地时区”?它是否取决于数据库或 JVM 设置?

4

2 回答 2

5

从概念上讲, ajava.sql.Date与 a 相同LocalDate,即。没有时间或时区的日期。在实践中,由于java.sql.Date是基于long毫秒实现的,它隐含使用了系统时区。因此,该toLocalDate()方法之所以存在,是因为 Java SQL 规范要求您将其java.sql.Date视为没有时区。

于 2016-06-09T12:05:50.380 回答
1

给定一个包装了固定毫秒值的 java.sql.Date-Object,您确实会根据系统上的默认时区获得不同的 LocalDate-Values。

我尝试了以下代码片段:

TimeZone.setDefault(TimeZone.getTimeZone("America/Los_Angeles"));
java.sql.Date sqlDate = new java.sql.Date(1465485798671l);
System.out.println(sqlDate.toLocalDate());
TimeZone.setDefault(TimeZone.getTimeZone("Asia/Tokyo"));
System.out.println(sqlDate.toLocalDate());

产生: 2016-06-09 2016-06-10

于 2016-06-09T15:31:46.893 回答