如何从 Instant 转换为 LocalDate
Posted
技术标签:
【中文标题】如何从 Instant 转换为 LocalDate【英文标题】:How to convert from Instant to LocalDate 【发布时间】:2019-02-15 07:12:05 【问题描述】:我有一个Instant
来自一个来源,根据规范,它应该是一个LocalDate
,但在LocalDate
类中看不到任何将Instant
转换为@987654325 的方法@。
最好的方法是什么?
【问题讨论】:
【参考方案1】:Java 9+
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);
见code run live at IdeOne.com。
请注意,日期是 22 日而不是 23 日,因为该时区使用 UTC 前几个小时的偏移量。
2020-01-22
Java 8
如果您使用的是 Java 8,那么您可以使用 ZonedDateTime
的 toLocalDate()
方法:
yourInstant.atZone(yourZoneId).toLocalDate()
【讨论】:
要补充一点,如果你想要一个来自“现在”的 LocalDate,你可以做以下的任意组合: yourZoneId =ZoneOffset.UTC
例如【参考方案2】:
其他答案提供了转换的机制,但我想添加一些有关这种转换含义的背景知识,希望有助于解释为什么它会以这种方式工作。
LocalDate
和Instant
看起来很相似——它们都保存日期(/时间)信息,但没有时区信息。但是,它们的含义完全不同。
Instant
明确表示一个时间点。该表示不明确包含任何时区,但隐含地引用了 UTC 时间线。
LocalDateTime
(和LocalDate
)是模棱两可的,因为它表示local时间线中的一个点,隐含地指local时区。 p>
因此,为了正确地将 Instant
转换为 LocalDateTime
(从概念上讲 - 其中一些步骤在实现中捆绑在一起成为单个操作),您需要:
1. 通过应用 UTC 时区信息将Instant
转换为ZonedDateTime
2. 将时区从 UTC 更改为 本地 时区(这意味着应用相关的时区偏移),这会为您提供另一个 ZonedDateTime
(具有不同的时区)
3. 将ZonedDateTime
转换为LocalDateTime
,通过删除时区信息使时区隐含(本地)。
最后,您可以删除LocalDateTime
的时间部分,并以LocalDate
结束。
【讨论】:
【参考方案3】:如果使用 java 8,您可以执行以下操作
Instant instantOfNow = Instant.now();
LocalDate localDate
= LocalDateTime.ofInstant(instantOfNow, ZoneOffset.UTC).toLocalDate();
【讨论】:
这个答案不对。应该是:LocalDateTime.ofInstant(schedParams.getEnd(), ZoneId.systemDefault()).toLocalDate();【参考方案4】:您需要问自己,您最有可能将其转换为哪个区域偏移量以及何时知道答案:
LocalDate.ofInstant(yourInstant, yourZoneOffSet)
编辑
刚刚意识到这只有在 java-9 之后才有可能,对于 pre-java9,请参阅the other answer
【讨论】:
【参考方案5】:完整运行示例,兼容 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);
【讨论】:
【参考方案6】: Instant instant = Instant.now();
LocalDate localDate = LocalDate.ofInstant(instant, ZoneOffset.UTC);
上面的代码对我有用。
【讨论】:
以上是关于如何从 Instant 转换为 LocalDate的主要内容,如果未能解决你的问题,请参考以下文章
LocalDate LocalTime LocalDateTime Instant的操作与使用