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

sim*_*des 114 java timestamp localtime java-8 java-time

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

ass*_*ias 179

你可以做:

timeStamp.toLocalDateTime().toLocalDate();
Run Code Online (Sandbox Code Playgroud)

  • 只需注意,`timestamp.toLocalDateTime()`方法将使用systemDefault时区进行转换.这可能是也可能不是你想要的. (51认同)

Pav*_*vel 7

我将略微扩展@assylias答案以考虑时区。至少有两种方法可以获取特定时区的LocalDateTime。

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

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

或者,您可以使用toInstant.atZone链:

timestamp.toInstant()
        .atZone(ZoneId.of("UTC"))
        .toLocalDate();
Run Code Online (Sandbox Code Playgroud)


Rus*_*lan 7

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

timeStamp.toLocalDateTime().toLocalDate();
Run Code Online (Sandbox Code Playgroud)

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

好的解决方案是

timestamp.toInstant().atZone(zoneId).toLocalDate()
Run Code Online (Sandbox Code Playgroud)

其中zoneId是要使用的时区,如果要使用系统时区或某些硬编码的时区(例如ZoneOffset.UTC ,则通常为ZoneId.systemDefault()

一般方法应该是

  1. 使用直接相关的类来随意使用新的java8日期类,例如,在我们的例子中,java.time.Instant与java.sql.Timestamp直接相关,即,它们之间不需要时区转换。
  2. 使用此java8类中精心设计的方法来做正确的事情。在我们的案例中,atZone(zoneId)明确表明我们正在进行转换,并为其使用了特定的时区。

  • @AutomatedMike 时间戳(以及日期)表示 UTC 中的时间点。LocalDate 并不代表时间点,而是代表挂钟上看到的时间。请阅读他们的 javadocs。“它们之间的转换可以独立于任何特定区域进行” - **不正确**, new Timestamp(0L).toLocalDateTime() 对于我的莫斯科时区返回“1970-01-01T03:00”。对于您所在的时区,结果可能会有所不同。 (7认同)
  • 我不同意。时间戳(以及日期)没有任何区域信息。LocalDate 没有任何区域信息,因此两者是等效的。它们之间的转换可以独立于任何特定区域来完成。在转换为 LocalDate 之前转换为 ZonedDateTime 会添加时区,然后再次将其删除 - 这样做更有可能出现令人讨厌的难以发现的错误。 (2认同)