根据规范,我有一个Instant
来自应为 a 的来源LocalDate
,但在LocalDate
类中看不到任何将其转换Instant
为 a 的方法LocalDate
。
做这个的最好方式是什么?
根据规范,我有一个Instant
来自应为 a 的来源LocalDate
,但在LocalDate
类中看不到任何将其转换Instant
为 a 的方法LocalDate
。
做这个的最好方式是什么?
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);
请注意,日期是 22 日而不是 23 日,因为该时区使用 UTC 前几个小时的偏移量。
2020-01-22
如果您使用的是 Java 8,那么您可以使用ZonedDateTime
'stoLocalDate()
方法:
yourInstant.atZone(yourZoneId).toLocalDate()
其他答案提供了转换的机制,但我想添加一些关于这种转换含义的背景知识,希望有助于解释为什么它会以这种方式工作。
LocalDate
并且Instant
看起来很相似——它们都保存没有时区信息的日期(/时间)信息。但是,它们的含义完全不同。
Instant
明确地表示一个时间点。该表示不明确包含任何时区,但隐含地引用了 UTC 时间线。
LocalDateTime
(and LocalDate
) 是模棱两可的,因为它表示本地时间轴中的一个点,隐含地指的是本地时区。
因此,为了正确地将 a 转换Instant
为 a LocalDateTime
(从概念上讲 - 其中一些步骤在实现中捆绑在一起成为单个操作),您需要:
1.通过应用 UTC 时区信息将a 转换Instant
为 a
2. 更改时间zone 从 UTC 到本地时区(这意味着应用相关的时区偏移量),这为您提供了另一个(具有不同时区)
3.通过删除时区信息将时区转换为隐式时区(本地)。ZonedDateTime
ZonedDateTime
ZonedDateTime
LocalDateTime
最后,您可以放弃时间部分LocalDateTime
并以LocalDate
.
如果使用 java 8,您可以执行以下操作
Instant instantOfNow = Instant.now();
LocalDate localDate
= LocalDateTime.ofInstant(instantOfNow, ZoneOffset.UTC).toLocalDate();
您需要问自己最有可能将其转换为的区域偏移量以及何时知道答案:
LocalDate.ofInstant(yourInstant, yourZoneOffSet)
编辑
刚刚意识到这只有在 java-9 之后才有可能,对于 pre-java9,请参阅其他答案
完整的运行示例,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);
}
}
Instant instant = Instant.now();
LocalDate localDate = LocalDate.ofInstant(instant, ZoneOffset.UTC);
上面的代码对我有用。