在 Java 8 中,如何将Timestamp
(in java.sql
)转换为LocalDate
(in java.time
)?
问问题
153707 次
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这样的硬编码时区
一般方法应该是
- 使用直接相关的类摆脱新的 java8 日期类,例如在我们的例子中java.time.Instant 与 java.sql.Timestamp 直接相关,即它们之间不需要时区转换。
- 使用这个 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 回答