JL *_*ley 17 java-8 localdate java.time.instant java.time
我有一个来自一个源的Instant,根据规范,它应该是一个LocalDate,但是在LocalDate中没有看到任何转换方法.做这个的最好方式是什么?
Rob*_*b C 32
LocalDate.ofInstant(...);
我相信是在Java 9中添加的.
LocalDateTime在Java 8中具有该方法.
yourInstant.atZone(yourZoneId).toLocalDate();
将适用于LocalDate的早期版本...
Krz*_*zki 10
其他答案提供了转换的机制,但我想为这种转换的含义添加一些背景知识,希望可以帮助解释它为何以其工作方式起作用。
LocalDate并且Instant看起来相似-它们都保存日期(/时间),时区信息。但是,它们具有完全不同的含义。
Instant明确表示一个时间点。该表示形式不明确包含任何时区,但隐式地指的是UTC时间线。
LocalDateTime(和LocalDate)含糊不清,因为它表示本地时间轴中的一个点,该点隐式指向本地时区。
因此,为了正确地将Instanta 转换为a LocalDateTime(从概念上讲,其中一些步骤在实施中捆绑在一起成为一个操作),您需要:
1. 通过应用UTC时区信息将其转换Instant为ZonedDateTimea。2
.更改时间从UTC到本地时区的时区(这意味着应用相关的时区偏移量),这会给您另一个ZonedDateTime(具有不同时区)
3.将转换ZonedDateTime为LocalDateTime,通过删除时区信息使时区隐式(本地)。
最后,您可以删除的时间部分LocalDateTime并以结束LocalDate。
如果使用Java 8,则可以执行以下操作
Instant instantOfNow = Instant.now();
LocalDate localDate
= LocalDateTime.ofInstant(instantOfNow, ZoneOffset.UTC).toLocalDate();
Run Code Online (Sandbox Code Playgroud)
您需要问自己最有可能将其转换为哪个区域偏移量,以及何时知道答案:
LocalDate.ofInstant(yourInstant, yourZoneOffSet)
Run Code Online (Sandbox Code Playgroud)
编辑
刚刚意识到这只有在 java-9 之后才有可能,对于 java9 之前的版本,请参阅其他答案