如何从 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,那么您可以使用 ZonedDateTimetoLocalDate() 方法:

yourInstant.atZone(yourZoneId).toLocalDate()

【讨论】:

要补充一点,如果你想要一个来自“现在”的 LocalDate,你可以做以下的任意组合: yourZoneId = ZoneOffset.UTC 例如【参考方案2】:

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


LocalDateInstant 看起来很相似——它们都保存日期(/时间)信息,但没有时区信息。但是,它们的含义完全不同。

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的操作与使用

Java8 Instant 时间戳

如何从 MySQL DATETIME 转换为 java.time.Instant 并在系统默认时区显示给用户?

我奶奶都能懂java8特性-日期时间

Java8 日期和时间实用技巧

如何将 LocalDate 转换为 SQL Date Java?