【问题标题】:Which timezone is java.sql.Date toLocalDate usingjava.sql.Date toLocalDate 使用哪个时区
【发布时间】:2016-06-09 11:54:05
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 这取决于 JVM 设置,例如系统属性“user.timezone”,另见getting default zone
  • 你确定吗? java.time 的其他部分似乎有点奇怪,这个默认值不能被覆盖或显式。
  • 这个问题看起来很相关,我猜这意味着它确实取决于系统设置。然而,toLocalDate 并没有在此处提及,并且对该特定问题的明确回答会很好。

标签: java java-8 java-time sqldatetime


【解决方案1】:

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

【讨论】:

  • 这是否意味着date.toLocalDate()会根据当前JVM的系统时区返回不同的LocalDate对象?
  • 这就是为什么该方法有@SuppressWarnings("deprecation")?这很有趣,因为 java.util.Date 不推荐使用大多数方法,而 java.sql.Date 不推荐使用其中的一些方法......
【解决方案2】:

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

【讨论】:

  • 等一下,该代码中没有toLocalDate。当我们添加它时会发生什么?
  • 嗨 Lars,对不起,我确实忘记添加 .toLocalDate() - 我已经编辑了代码。
  • 优秀的答案。接受!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-03-01
  • 2018-09-26
  • 2014-11-25
  • 1970-01-01
  • 2014-05-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多