167

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

4

3 回答 3

254

你可以做:

timeStamp.toLocalDateTime().toLocalDate();

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

于 2014-04-24T09:07:25.953 回答
45

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

timeStamp.toLocalDateTime().toLocalDate();

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

好的解决方案是

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

其中zoneId是您要使用的时区,如果您想使用系统时区,通常是ZoneId.systemDefault()或像ZoneOffset.UTC这样的硬编码时区

一般方法应该是

  1. 使用直接相关的类摆脱新的 java8 日期类,例如在我们的例子中java.time.Instant 与 java.sql.Timestamp 直接相关,即它们之间不需要时区转换。
  2. 使用这个 java8 类中精心设计的方法来做正确的事。在我们的例子中, atZone(zoneId)明确表示我们正在进行转换并为其使用特定的时区。
于 2019-07-18T19:35:29.963 回答
8

我将稍微扩展@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();
于 2018-06-26T14:21:05.153 回答