java.sql.Date toLocalDate 使用哪个时区

Which timezone is java.sql.Date toLocalDate using

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

java.util.Datejava.time.Instant 没有可比较的方法。似乎在java.time中,必须始终提供ZoneId以获得"LocalFoo"或"OffsetBar"。

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

Converts this Date object to a LocalDate. The conversion creates a LocalDate that represents the same date value as this Date in local time zone

"local time zone" 是哪个时区?它取决于数据库或 JVM 设置吗?

从概念上讲,java.sql.DateLocalDate 相同,即。没有时间或时区的日期。实际上,因为 java.sql.Date 是基于 long 毫秒实现的,所以它隐含地使用了系统时区。因此,存在 toLocalDate() 方法是因为 Java SQL 规范让您认为 java.sql.Date 没有时区。

给定一个包含固定毫秒值的 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());

产生: <code>2016-06-09 2016-06-10