joda Chronology 和 DateTimeZone 之间有什么区别?

What is the difference between a joda Chronology and a DateTimeZone?

特别是,为什么时区感知 LocalTime 的构造函数需要 Chronology 而不是 DateTimeZone

    public LocalTime(
            int hourOfDay,
            int minuteOfHour,
            int secondOfMinute,
            int millisOfSecond,
            Chronology chronology)    // <--- this

为什么我们不能只传递一个 DateTimeZone 来指定时区? ChronologyDateTimeZone 之间有什么区别——它们似乎都只是用来在这里指定时区?

这只是意味着我最终不得不通过调用 ISOChronology.getInstance() 来包装任何时区,这看起来很麻烦:

new LocalTime(18, 0, 0, 0, ISOChronology.getInstance(DateTimeZone.forID("America/New_York")))

TL;DR: 在您的特定示例中没有区别。我找不到有任何区别的示例,尽管 LocalTime 的序列化可能在极端情况下存在。年表的时区被忽略。

浏览 LocalTime 的源代码揭示了一些观察结果:

  • LocalTime 始终在内部使用 UTC 时区。因此,无论您经过哪个年表或时区,您都不会得到我所说的 timezone-aware LocalTime。因此提供 LocalTime(int, int, int, int, DateTimeZone) 构造函数将毫无意义。
  • 时间顺序readResolve方法使用的,反序列化使用的方法。有一个 Javadoc 评论指出 Handle broken serialization from other tools。 我不知道它是什么意思。在我看来,所有代码所做的就是确保 object 中存储的年表使用 UTC 时区。与完全不存储任何年表相比,任何优势都让我失望。

It just means I end up having to wrap any timezone with a call to ISOChronology.getInstance() which seems cumbersome:

new LocalTime(18, 0, 0, 0, ISOChronology.getInstance(DateTimeZone.forID("America/New_York")))

LocalTime object 无论如何都会忽略时区。您正在使用的构造函数的文档说:

Constructs an instance set to the specified time using the specified chronology, whose zone is ignored.

所以我认为你也可以使用:

new LocalTime(18, 0)

如果需要指定秒and/or毫秒,可以提供三个或四个参数。 LocalTimeclass共有13个构造函数可供选择

证明(并令人失望?):

    LocalTime timeInNewYork = new LocalTime(18, 0, 0, 0,
            ISOChronology.getInstance(DateTimeZone.forID("America/New_York")));
    System.out.println(timeInNewYork.getChronology().getZone());

输出:

UTC

为了更直接地回答标题中的问题,Chronology class 用于处理不同的日历系统,例如伊斯兰历或佛历,这与 DateTimeZone 不同做。还有一些在 LocalTime 的上下文中似乎并不立即需要的东西,所以有充分的理由问你的问题。

进一步的观察是java.time,受Joda-Time启发的现代Java日期和时间API,完全分离了年表和时区的概念。 java.time 年表不包括时区。 java.time LocalTime objects 既不使用年表也不使用时区(除了它的静态 now 方法非常合理地接受 ZoneId 参数;我认为这是一个不同的故事)。

如何解决?

So how do we create a timezone-aware LocalTime with Joda then?

编辑:这有多大意义?对于某个时区每天某个时间发生的事件?当然,如果您正在设计一个需要存储的日历系统,比如说,每天发生在智利圣地亚哥 16:00 的事件和每天发生在纽约 18:00 的另一事件,纽约。你知道,我不知道。

回答一下,据我所知,你不能。 LocalTime中的local表示without time zone(不明显,但确实如此)

如果是我,我会将时间存储在 LocalTime 中,将时区存储在 DateTimeZone 中。那会给你你需要的数据。您可以将这两部分包裹成您自己的 class,例如 TimeZonedTime class。

java.time 提供了一个 OffsetTime class,一个带有偏移量的时间。所以这不是 time-zone 感知时间,只是 UTC 偏移感知时间。不知道对你有没有帮助,只是觉得值得一提,以防万一

链接