如何从Instant转换为LocalDate

时间:2018-09-10 20:07:04

标签: java-8 localdate java.time.instant java.time

我有一个Instant消息,根据规范,该消息应该是LocalDate,但在LocalDate中看不到任何用于转换的方法。最好的方法是什么?

6 个答案:

答案 0 :(得分:21)

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

LocalDateTime在Java 8中具有该方法。

yourInstant.atZone(yourZoneId).toLocalDate(); 将与LocalDate的早期版本一起使用...

答案 1 :(得分:4)

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

Instant instantOfNow = Instant.now();
LocalDate localDate 
    = LocalDateTime.ofInstant(instantOfNow, ZoneOffset.UTC).toLocalDate();

答案 2 :(得分:3)

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

LocalDate.ofInstant(yourInstant, yourZoneOffSet)

编辑

我刚刚意识到这只有从Java-9开始才有可能,对于Java9之前的版本,请参见the other answer

答案 3 :(得分:3)

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


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

Instant明确表示一个时间点。该表示形式未明确包含任何时区,但暗含了UTC时间线。

LocalDateTime(和LocalDate)是模棱两可的,因为它代表了 local 时间轴中的一个点,该点隐含了 local 时间区域。

因此,为了正确地将Instant转换为LocalDateTime(从概念上讲,这些步骤中的某些步骤捆绑在一起成为一个操作),您需要:
1.通过应用UTC时区信息,将Instant转换为ZonedDateTime
2.将时区更改为 local 时区(这意味着添加时区之间的时差)
3.将ZonedDateTime转换为LocalDateTime,通过删除时区信息使时区隐式( local )。

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

答案 4 :(得分:0)

 Instant instant = Instant.now();   
 LocalDate localDate = LocalDate.ofInstant(instant, ZoneOffset.UTC);

上面的代码对我有用。

答案 5 :(得分:0)

完整的运行示例,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);
  }
}