java.sql.Date toLocalDate 使用哪个时区
Which timezone is java.sql.Date toLocalDate using
我很惊讶 java.sql.Date
有一个方法 toLocalDate()
。
java.util.Date
或 java.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.Date
与 LocalDate
相同,即。没有时间或时区的日期。实际上,因为 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
我很惊讶 java.sql.Date
有一个方法 toLocalDate()
。
java.util.Date
或 java.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.Date
与 LocalDate
相同,即。没有时间或时区的日期。实际上,因为 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