【问题标题】:How to convert a LocalDate to an Instant?如何将 LocalDate 转换为 Instant?
【发布时间】:2014-04-22 09:15:09
【问题描述】:

我使用 Java 8 的新 DateTime API。

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

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

我不明白为什么。

【问题讨论】:

  • 因为LocalDate 不包含时间。

标签: java datetime java-8 java-time


【解决方案1】:

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

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

【讨论】:

  • 非常感谢。我现在明白了,我需要指定一个时区才能获得 Instant。
  • 完美答案!
【解决方案2】:

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

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

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


更新:接受的答案使用LocalDateTime::toInstant(ZoneOffset),它只接受ZoneOffset。这个答案使用LocalDate::atStartOfDay(ZoneId),它接受任何ZoneId。因此,这个答案通常更有用(并且可能应该被接受)。

PS。我是 API 的主要作者

【讨论】:

  • 我认为这比接受的答案更有用,因为 ZoneId(时区)是参数而不是 ZoneOffset(从 UTC 偏移的小时数,夏季/冬季的时区可能会改变)。跨度>
  • 在我正在编写的单元测试中,我有一个 LocalDate,它被转换为 com.google.protobuf.Timestamp,然后通过 Instant 映射回 LocalDate,两种方式。当使用接受的答案建议的方法时,我得到了预期的 LocalDate 作为回报,但使用这种方法给了我“昨天”而不是“今天”。我的时区是 GMT+1
猜你喜欢
  • 2019-02-15
  • 2020-09-24
  • 1970-01-01
  • 2020-04-10
  • 1970-01-01
  • 2011-08-01
  • 2019-01-11
  • 2019-07-22
相关资源
最近更新 更多