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

java.sql.Date toLocalDate使用哪个时区,java,java-8,java-time,sqldatetime,Java,Java 8,Java Time,Sqldatetime,我很惊讶java.sql.Date有一个方法toLocalDate() java.util.Date或java.time.Instant没有可比的方法。似乎在java.time中,必须始终提供ZoneId以获取“LocalFoo”或“OffsetBar” 从java.sql.Date#toLocalDate()的javadoc中: 将此日期对象转换为LocalDate。 转换将创建一个 LocalDate,表示与本地数据库中的此日期相同的日期值 时区 哪个时区是“本地时区”?它是否取决于数据库或

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

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

java.sql.Date#toLocalDate()
的javadoc中:

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


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

从概念上讲,
java.sql.Date
LocalDate
相同,即没有时间或时区的日期。实际上,由于
java.sql.Date
是基于
long
毫秒实现的,因此它隐含了系统时区的用法。因此,之所以存在
toLocalDate()
方法,是因为Java SQL规范的负责人希望您将
Java.SQL.Date
视为没有时区。

给定一个包含固定毫秒值的Java.SQL.Date-Object,您将根据系统上的默认时区获得不同的LocalDate值

我尝试了以下代码段:

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

这取决于JVM设置,例如系统属性“user.timezone”,也请参见您确定吗?对于java.time的其他部分来说,这似乎有点奇怪,这个默认值不能被覆盖或显式化。这个问题的可能重复看起来非常相关,我猜这意味着它确实取决于系统设置。但是这里没有提到
toLocalDate
,明确回答这个特定的问题会更好。这是否意味着
date.toLocalDate()
将返回不同的LocalDate对象,这取决于当前JVM的系统时区?这就是为什么该方法有@SuppressWarnings(“弃用”)?这很有趣,因为java.util.Date不推荐大多数方法,而java.sql.Date不预先定义其中的一些方法……等等,代码中没有
toLocalDate
。当我们添加它时会发生什么?嗨,Lars,很抱歉我确实忘记添加.toLocalDate()-我已经编辑了代码。回答得很好。认可的!