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
来指定时区?
Chronology
和 DateTimeZone
之间有什么区别——它们似乎都只是用来在这里指定时区?
这只是意味着我最终不得不通过调用 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毫秒,可以提供三个或四个参数。 LocalTime
class共有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,例如 Time
或 ZonedTime
class。
java.time 提供了一个 OffsetTime
class,一个带有偏移量的时间。所以这不是 time-zone 感知时间,只是 UTC 偏移感知时间。不知道对你有没有帮助,只是觉得值得一提,以防万一
链接
- Joda-Time
Chronology
documentation
- Joda-Time
LocalTime
documentation
- java.time
OffsetTime
documentation
特别是,为什么时区感知 LocalTime
的构造函数需要 Chronology
而不是 DateTimeZone
?
public LocalTime(
int hourOfDay,
int minuteOfHour,
int secondOfMinute,
int millisOfSecond,
Chronology chronology) // <--- this
为什么我们不能只传递一个 DateTimeZone
来指定时区?
Chronology
和 DateTimeZone
之间有什么区别——它们似乎都只是用来在这里指定时区?
这只是意味着我最终不得不通过调用 ISOChronology.getInstance()
来包装任何时区,这看起来很麻烦:
new LocalTime(18, 0, 0, 0, ISOChronology.getInstance(DateTimeZone.forID("America/New_York")))
TL;DR: 在您的特定示例中没有区别。我找不到有任何区别的示例,尽管 LocalTime
的序列化可能在极端情况下存在。年表的时区被忽略。
浏览 LocalTime
的源代码揭示了一些观察结果:
LocalTime
始终在内部使用 UTC 时区。因此,无论您经过哪个年表或时区,您都不会得到我所说的 timezone-awareLocalTime
。因此提供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毫秒,可以提供三个或四个参数。 LocalTime
class共有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,例如 Time
或 ZonedTime
class。
java.time 提供了一个 OffsetTime
class,一个带有偏移量的时间。所以这不是 time-zone 感知时间,只是 UTC 偏移感知时间。不知道对你有没有帮助,只是觉得值得一提,以防万一
链接
- Joda-Time
Chronology
documentation - Joda-Time
LocalTime
documentation - java.time
OffsetTime
documentation