Java 8 如何从Instant转换为LocalDate

Java 8 如何从Instant转换为LocalDate,java-8,localdate,java.time.instant,java-time,Java 8,Localdate,Java.time.instant,Java Time,我有一个来自一个源的即时消息,根据规范,它应该是LocalDate,但是在LocalDate中看不到任何用于转换的方法。最好的方法是什么?您需要问问自己,最有可能将其转换为哪个区域偏移量,以及何时知道答案: LocalDate.ofInstant(yourInstant, yourZoneOffSet) 编辑 刚刚意识到这只有在java-9之后才有可能,对于java-9之前的版本,请参见+ 抵达爪哇岛9 Instant-Instant=Instant.parse(“2020-01-23T00:

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

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

LocalDate.ofInstant(yourInstant, yourZoneOffSet)
编辑

刚刚意识到这只有在java-9之后才有可能,对于java-9之前的版本,请参见+ 抵达爪哇岛9

Instant-Instant=Instant.parse(“2020-01-23T00:00:00Z”);
ZoneId z=ZoneId.of(“美国/埃德蒙顿”);
LocalDate ld=LocalDate.of瞬时(瞬时,z);

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

2020-01-22

爪哇8
ZonedDateTime
在Java8中有一个
.toLocalDate()
方法

yourInstant.atZone(yourZoneId.toLocalDate()

将与LocalDate的早期版本一起使用…

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


LocalDate
Instant
似乎相似–它们都包含日期(/time)信息,而不包含时区信息。然而,它们有着完全不同的含义

Instant
明确地表示时间点。表示形式不显式包含任何时区,但隐式引用UTC时间线

LocalDateTime
(和
LocalDate
)是不明确的,因为它代表本地时间线中的一个点,该点隐含地指向本地时区

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


最后,您可以删除
LocalDateTime
的时间部分,并以
LocalDate
结束。如果使用Java8,您可以执行以下操作

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

以上代码对我很有用。

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

要添加到这一点上,如果您想要从“现在”开始的LocalDate,您可以执行以下任意组合:yourZoneId=
ZoneOffset.UTC
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);
  }
}