Java 8 如何从Instant转换为LocalDate
我有一个来自一个源的即时消息,根据规范,它应该是LocalDate,但是在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.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);
}
}