如何将LocalDate转换为Instant?


106

我使用Java 8的新DateTime API。

如何将LocalDate转换为Instant?我有一个例外

LocalDate date = LocalDate.of(2012, 2, 2);
Instant instant = Instant.from(date);

我不明白为什么。


因为a LocalDate不包括时间。
OrangeDog

Answers:


97

Instant类表示时间线的瞬时点。往返之间的转换LocalDate需要一个时区。与其他日期和时间库不同,JSR-310不会自动为您选择时区,因此您必须提供它。

LocalDate date = LocalDate.now();
Instant instant = date.atStartOfDay(ZoneId.systemDefault()).toInstant();

本示例使用JVM的默认时区ZoneId.systemDefault()--执行转换。有关相关问题的详细答案,请参见此处。


更新:接受的答案使用LocalDateTime::toInstant(ZoneOffset)仅接受的答案ZoneOffset。此答案使用LocalDate::atStartOfDay(ZoneId)接受any ZoneId。因此,此答案通常更有用(可能应该是公认的答案)。

PS。我是API的主要作者


1
我认为这比已接受的答案更有用,因为ZoneId(时区)是参数,而不是ZoneOffset(从UTC转移的小时数,夏/冬时区可能会有所变化)。
wuerg

1
在我正在编写的单元测试中,我有一个LocalDate,将其转换为com.google.protobuf.Timestamp,然后通过Instant(两种方式)映射回LocalDate。当使用该方法时,可接受的答案表明,我得到了预期的LocalDate作为回报,但是使用此方法使我“昨天”返回,而不是“今天”。我的时区是格林尼治标准时间+1
Nadrendion,

127

为了将其转换为即时,您需要具有LocalDateTime实例,例如:

LocalDate.now().atStartOfDay().toInstant(ZoneOffset.UTC)

非常感谢。我现在了解,我需要指定一个时区以获得即时消息。
user1643352 2014年
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.