【问题标题】:Why does LocalDateTime.ofInstant() requires ZoneId为什么 LocalDateTime.ofInstant() 需要 ZoneId
【发布时间】:2023-01-26 17:16:17
【问题描述】:

在爪哇,

  • 如果Instant代表一个时间点,编码为日期和时间 世界标准时间。
  • LocalDateTime 表示一个时间点,编码为 JVM 本地时区中的日期和时间。

为什么LocalDateTime.ofInstant() 需要ZoneId 作为第二个参数?

这使得 LocalDateTime 不仅令人困惑并且可能不正确,而且与 ZonedDateTime 相同;因为LocalDateTime 的时区可以是任何时区,就像ZonedDateTime 一样。

【问题讨论】:

    标签: java


    【解决方案1】:

    LocalDateTime 表示一个时间点,编码为 JVM 本地时区中的日期和时间。

    不,那不是真的。不管“编码为”部分(我非常怀疑,但我没有足够的知识来反驳),LocalDateTime 确实不是代表一个时间点。它表示本地日期/时间,不参考特定时区。任何给定的LocalDateTime 都发生在不同时区的不同时间点。

    目前欧洲/伦敦时区的本地日期和时间是 2023-01-26T08:50。这同一时间点在(比方说)America/New_York 中会产生不同的 LocalDateTime。而在 America/New_York,2023-01-26T08:50 的 LocalDateTime 出现在不同的时间点。

    对于某些 LocalDateTime / 时区组合,可能有零个或两个对应的时间点 - 例如,LocalDateTime 2022-11-06T01:30 将出现在 America/New_York 的两个 2022-11-06 05: 30:00Z 和 2022-11-06 06:30:00Z。

    希望这足以证明 LocalDateTime 真的不是一个时间点...

    【讨论】:

      【解决方案2】:

      LocalDateTime 表示没有时区信息的日期和时间。它用于表示“本地时间”(以我为例,现在本地时间是 2023-01-26 09:50)。 Instant 总是在 UTC(例如,现在的时间是 2023-01-26 08:50 UTC)。要在 Instant 和观察者认为的当地时间之间进行转换,您需要知道观察者所在位置的 ZoneId(例如,对我来说是欧洲/阿姆斯特丹),否则您无法得出当地时间。

      需要明确的是, LocalDateTime 不代表时间点(这就是 Instant 的用途)。为了扩展我的例子,对我来说,当地时间 2023-01-26 09:50 已经过去了,而对于 Jon Skeet(在欧洲/伦敦)来说,当地时间将在不到一个小时的时间内发生。

      【讨论】:

        【解决方案3】:

        .ofInstant() 用于指定即时和时区。

        如果您不想指定时区和时间,您可以使用.now(),这将使用当地的日期和时间。

        如果你想指定即时而不是 ZoneId,你可以使用ZomeId.systemDefault()

        【讨论】:

          猜你喜欢
          • 2019-06-09
          • 2020-05-03
          • 2017-11-18
          • 2020-03-22
          • 2011-08-11
          • 2019-06-09
          • 2012-05-21
          • 2020-02-26
          • 2019-10-12
          相关资源
          最近更新 更多