76

根据规范,我有一个Instant来自应为 a 的来源LocalDate,但在LocalDate类中看不到任何将其转换Instant为 a 的方法LocalDate

做这个的最好方式是什么?

4

6 回答 6

125

Java 9+

LocalDate.ofInstant(...)到达Java 9。

Instant instant = Instant.parse("2020-01-23T00:00:00Z");
ZoneId zone = ZoneId.of("America/Edmonton");
LocalDate date = LocalDate.ofInstant(instant, zone);

查看在 IdeOne.com 上实时运行的代码

请注意,日期是 22 日而不是 23 日,因为该时区使用 UTC 前几个小时的偏移量。

2020-01-22

爪哇 8

如果您使用的是 Java 8,那么您可以使用ZonedDateTime'stoLocalDate()方法:

yourInstant.atZone(yourZoneId).toLocalDate()
于 2018-09-10T20:22:24.410 回答
30

其他答案提供了转换的机制,但我想添加一些关于这种转换含义的背景知识,希望有助于解释为什么它会以这种方式工作。


LocalDate并且Instant看起来很相似——它们都保存没有时区信息的日期(/时间)信息。但是,它们的含义完全不同。

Instant明确地表示一个时间点。该表示不明确包含任何时区,但隐含地引用了 UTC 时间线。

LocalDateTime(and LocalDate) 是模棱两可的,因为它表示本地时间轴中的一个点,隐含地指的是本地时区。

因此,为了正确地将 a 转换Instant为 a LocalDateTime(从概念上讲 - 其中一些步骤在实现中捆绑在一起成为单个操作),您需要:
1.通过应用 UTC 时区信息将a 转换Instant为 a 2. 更改时间zone 从 UTC 到本地时区(这意味着应用相关的时区偏移量),这为您提供了另一个(具有不同时区) 3.通过删除时区信息将时区转换为隐式时区(本地)。ZonedDateTime
ZonedDateTime
ZonedDateTimeLocalDateTime

最后,您可以放弃时间部分LocalDateTime并以LocalDate.

于 2018-12-02T12:38:14.943 回答
15

如果使用 java 8,您可以执行以下操作

Instant instantOfNow = Instant.now();
LocalDate localDate 
    = LocalDateTime.ofInstant(instantOfNow, ZoneOffset.UTC).toLocalDate();
于 2019-01-08T16:14:31.940 回答
5

您需要问自己最有可能将其转换为的区域偏移量以及何时知道答案:

LocalDate.ofInstant(yourInstant, yourZoneOffSet)

编辑

刚刚意识到这只有在 java-9 之后才有可能,对于 pre-java9,请参阅其他答案

于 2018-09-10T20:09:29.783 回答
1

完整的运行示例,Java 8 兼容:

import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;

class Scratch {

  public static void main(String[] args) {
    Instant now = Instant.now();
    LocalDateTime ldt = now.atZone(ZoneId.systemDefault()).toLocalDateTime();
    System.out.println(ldt);
  }
}
于 2021-05-02T23:32:10.757 回答
0
 Instant instant = Instant.now();   
 LocalDate localDate = LocalDate.ofInstant(instant, ZoneOffset.UTC);

上面的代码对我有用。

于 2020-10-27T14:16:34.153 回答