如何将java.sql.timestamp转换为LocalDate(java8)java.time?
在Java 8中,如何将如何将java.sql.timestamp转换为LocalDate(java8)java.time?,java,timestamp,java-8,localtime,java-time,Java,Timestamp,Java 8,Localtime,Java Time,在Java 8中,如何将时间戳(在Java.sql中)转换为LocalDate(在Java.time中)?您可以执行以下操作: timeStamp.toLocalDateTime().toLocalDate(); 请注意,timestamp.toLocalDateTime()将使用Clock.systemDefaultZone()时区进行转换。这可能是您想要的,也可能不是您想要的 我将稍微扩展@assylias answer以考虑时区。至少有两种方法可以获取特定时区的LocalDateTime
时间戳
(在Java.sql
中)转换为LocalDate
(在Java.time
中)?您可以执行以下操作:
timeStamp.toLocalDateTime().toLocalDate();
请注意,timestamp.toLocalDateTime()
将使用Clock.systemDefaultZone()
时区进行转换。这可能是您想要的,也可能不是您想要的
我将稍微扩展@assylias answer以考虑时区。至少有两种方法可以获取特定时区的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是您想要使用的时区,如果您想要使用系统时区或一些硬编码时区,如ZoneOffset.UTC
一般做法应该是:
Java 8中添加了它。请注意,
timestamp.toLocalDateTime()
方法将使用系统默认时区进行转换。这可能是您想要的,也可能不是您想要的。@jacobhyblenated请使用显式时区发布答案。谢谢@jacobhyphenated的评论在这里非常重要,因此获得了更多的支持票。有关详细信息,请参见我的答案@jacobhyphenated,LocalDateTime
始终使用系统默认时区。这就是“本地”在其名称中的含义。我在这里有一个类似的问题:。简短的回答,不是真的。但这不一定是坏事,我不同意。时间戳(以及日期)没有任何区域信息。LocalDate没有任何区域信息,因此两者是等效的。它们之间的转换可以独立于任何特定区域进行。在转换为LocalDate之前,先转换为ZoneDateTime会增加一个时区,然后再将其取消-这样做很可能会出现一个令人讨厌的、难以发现的错误。@AutomatedMike时间戳(以及日期)表示UTC中的一个时间点。LocalDate并不代表时间点,而是一个在挂钟上看到的时间。请阅读他们的javadocs。“它们之间的转换可以独立于任何特定区域进行”-不正确,新的时间戳(0L)。toLocalDateTime()为我的莫斯科时区返回“1970-01-01T03:00”。对于您的时区,结果可能不同。@AutomatedMike即使您通过执行toLocalDate()来剥离时间,也很容易证明,如果时间戳的时间在午夜左右,例如新的时间戳(1000*60*60*23)。toLocalDateTime()。toLocalDate()在我的莫斯科时区为“1970-01-01”时返回“1970-01-02”在UTC中。@AutomatedMike“添加一个时区,然后再将其删除”-重点不是添加和删除一个时区,而是通过使用显式时区在不同概念之间转换。这与我前面两个注释中隐式应用时区的示例形成对比。