如何转换Instant到LocalDate

JL *_*ley 17 java-8 localdate java.time.instant java.time

我有一个来自一个源的Instant,根据规范,它应该是一个LocalDate,但是在LocalDate中没有看到任何转换方法.做这个的最好方式是什么?

Rob*_*b C 32

LocalDate.ofInstant(...); 我相信是在Java 9中添加的.

LocalDateTime在Java 8中具有该方法.

yourInstant.atZone(yourZoneId).toLocalDate(); 将适用于LocalDate的早期版本...

  • @Pipo我猜 `yourZoneId` 应该是 `ZoneId.systemDefault()` 因为我们转换为用户的本地日期 (2认同)

Krz*_*zki 10

其他答案提供了转换的机制,但我想为这种转换的含义添加一些背景知识,希望可以帮助解释它为何以其工作方式起作用。


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

Instant明确表示一个时间点。该表示形式不明确包含任何时区,但隐式地指的是UTC时间线。

LocalDateTime(和LocalDate)含糊不清,因为它表示本地时间轴中的一个点,该点隐式指向本地时区。

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

最后,您可以删除的时间部分LocalDateTime并以结束LocalDate


Rob*_*_UK 8

如果使用Java 8,则可以执行以下操作

Instant instantOfNow = Instant.now();
LocalDate localDate 
    = LocalDateTime.ofInstant(instantOfNow, ZoneOffset.UTC).toLocalDate();
Run Code Online (Sandbox Code Playgroud)

  • 这个答案是不对的。它应该是: LocalDateTime.ofInstant(schedParams.getEnd(), ZoneId.systemDefault()).toLocalDate(); (2认同)

Eug*_*ene 5

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

LocalDate.ofInstant(yourInstant, yourZoneOffSet)
Run Code Online (Sandbox Code Playgroud)

编辑

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