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


Answers:


195

你可以做:

timeStamp.toLocalDateTime().toLocalDate();

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


1
它已在Java 8中添加
。– assylias

54
请注意,该timestamp.toLocalDateTime()方法将使用systemDefault时区进行转换。这可能是您想要的,也可能不是。
jacobhyphenated 2014年

1
@jacobhyphenated请使用明确的时区发布答案。谢谢!
user482745

@jacobhyphenated的评论在这里非常重要,因此支持它的人数很多。详情请见我的答案stackoverflow.com/a/57101544/2032701
俄罗斯

@jacobhyphenated,LocalDateTime始终使用系统默认时区。这就是“本地”名称的含义。
M. Prokhorov

20

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

timeStamp.toLocalDateTime().toLocalDate();

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

好的解决方案是

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

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

一般方法应该是

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

1
我不同意。时间戳(以及日期)没有任何区域信息。LocalDate没有任何区域信息,因此两者是等效的。它们之间的转换可以独立于任何特定区域进行。在转换为LocalDate之前转换为ZonedDateTime会添加一个时区,然后再将其取消-这样您就更容易出现讨厌的-很难找到-错误。
AutomatedMike,

5
@AutomatedMike时间戳(以及日期)代表UTC中的时间点。LocalDate并不代表时间点,而是代表墙上时钟上看到的时间。请阅读他们的javadocs。“它们之间的转换可以独立于任何特定区域进行”- 不正确,new Timestamp(0L).toLocalDateTime()为我的莫斯科时区返回“ 1970-01-01T03:00”。对于您的时区,结果可能会有所不同。
罗斯兰

1
@AutomatedMike即使您通过执行toLocalDate()剥离时间,也很容易证明,如果Timestamp的时间大约在午夜,例如new timestamp(1000 * 60 * 60 * 23).toLocalDateTime()。toLocalDate ()在UTC中为我的莫斯科时区返回“ 1970-01-02”。
罗斯兰

1
@AutomatedMike“添加时区,然后再将其取消”-重点不是添加和删除时区,而是通过使用显式时区在不同概念之间进行转换。这与我前面的两条评论中的例子形成了对比,在前面的两条评论中,时区被隐式地应用。
罗斯兰

7

我将略微扩展@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();
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.