【问题标题】:How to convert from Instant to LocalDate如何从 Instant 转换为 LocalDate
【发布时间】:2019-02-15 07:12:05
【问题描述】:

我有一个Instant 来自一个来源,根据规范,它应该是一个LocalDate,但在LocalDate 类中看不到任何将Instant 转换为@987654325 的方法@。

最好的方法是什么?

【问题讨论】:

    标签: java-8 localdate java.time.instant java-time


    【解决方案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);
          

          上面的代码对我有用。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2020-09-24
            • 1970-01-01
            • 1970-01-01
            • 2020-04-10
            • 1970-01-01
            • 2011-08-01
            • 2019-01-11
            相关资源
            最近更新 更多