如何将 java.sql.time戳转换为 LocalDate (java8) java.time?

在 Java8中,如何将 Timestamp(在 java.sql中)转换为 LocalDate(在 java.time中) ?

183445 次浏览

你可以这样做:

timeStamp.toLocalDateTime().toLocalDate();

请注意,timestamp.toLocalDateTime() 将使用 Clock.systemDefaultZone()时区进行转换。这可能是或可能不是你想要的。

我稍微扩展一下@assylias 的回答,把时区考虑进去。至少有两种方法可以获取特定时区的 LocalDateTime。

可以在整个应用程序中使用 setDefault 时区,它应该在任何时间戳-> java.time 转换之前调用:

public static void main(String... args) {
TimeZone utcTimeZone = TimeZone.getTimeZone("UTC");
TimeZone.setDefault(utcTimeZone);
...
timestamp.toLocalDateTime().toLocalDate();
}

或者你可以使用 toInstant.atZone 链:

timestamp.toInstant()
.atZone(ZoneId.of("UTC"))
.toLocalDate();

接受的答案并不理想,所以我决定加上我的2分钱

timeStamp.toLocalDateTime().toLocalDate();

一般来说 是一个糟糕的解决方案,我甚至不确定他们为什么要将这个方法添加到 JDK 中,因为它使用系统时区执行隐式转换会使事情变得非常混乱。通常,当只使用 java8日期类时,程序员被迫指定一个时区,这是一件好事。

好的解决办法是

timestamp.toInstant().atZone(zoneId).toLocalDate()

其中 ZoneId是您想要使用的时区,如果您想要使用系统时区,通常是 ZoneId.systemDefault ()或一些硬编码的时区,如 协调世界时区域偏移量

一般的方法应该是

  1. 使用一个直接相关的类(例如,在我们的例子中是 Instant 与 java.sql.Timestamp 直接相关) ,从新的 java8日期类中解放出来,即它们之间不需要时区转换。
  2. 使用这个 java8类中设计良好的方法来做正确的事情。在我们的例子中,AtZone (zoneId)明确表示我们正在进行转换并使用特定的时区。