如何将LocalDate转换为Instant?

180

我使用Java 8的新DateTime API。

如何将LocalDate转换为Instant? 我得到了一个异常。

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

我不明白为什么。


因为LocalDate不包含时间。 - OrangeDog
3个回答

209

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),它接受任何ZoneId。因此,本答案通常更实用(并且可能应该成为被接受的答案)。

PS. 我是API的主要作者。


3
我认为这个答案比被接受的答案更有用,因为ZoneId(时区)是参数,而不是ZoneOffset(与UTC偏移的小时数,在夏季/冬季可能会改变的时区)。 - wuerg
1
在我编写的单元测试中,我有一个LocalDate,它被转换为com.google.protobuf.Timestamp,然后通过Instant又映射回LocalDate。当使用接受的答案建议的方法时,我得到了预期的LocalDate返回值,但是使用这种方法却返回了“昨天”而不是“今天”。我的时区是GMT+1。 - Nadrendion

178

为了将其转换为Instant,您需要拥有一个LocalDateTime实例,例如:

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

非常感谢。我现在明白了,我需要指定一个时区来获取一个Instant。 - user1643352
完美的答案! - Gaurav
这对于协调世界时(UTC)来说很好,但对于当地时区来说可能不适用,因为偏移量可能会根据当地日期的变化而改变(例如夏令时或冬令时)。 - undefined

1

使用这个方法,我可以获取本地日期时间实例:

LocalDateTime.now().toInstant(ZoneOffset.UTC)

2
你的答案涉及到 LocalDateTime,而不是 LocalDate - Ilya Serbis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接