问题描述
特别是,为什么时区感知LocalTime
的构造函数需要Chronology
而不是DateTimeZone
?
public LocalTime(
int hourOfDay,int minuteOfHour,int secondOfMinute,int millisOfSecond,Chronology chronology) // <--- this
为什么我们不能仅传递DateTimeZone
来指定时区?
Chronology
和DateTimeZone
有什么区别-它们似乎都只是用来在此处指定时区的?
这只是意味着我最终不得不通过调用ISOChronology.getInstance()
来包装任何时区,这似乎很麻烦:
new LocalTime(18,ISOChronology.getInstance(DateTimeZone.forID("America/New_York")))
解决方法
TL; DR:在您的特定示例中没有区别。我找不到一个有任何区别的示例,尽管对LocalTime
进行序列化可能会遇到一些极端情况。年表的时区将被忽略。
跳过LocalTime
的源代码可以发现以下几点:
-
LocalTime
始终在内部使用UTC时区。因此,无论您经过哪个时间顺序或时区,都不会得到我所说的时区感知LocalTime
。因此,提供LocalTime(int,int,DateTimeZone)
构造函数将毫无意义。 - 年代{em} 由
readResolve
方法使用,这是反序列化方法。有Javadoc注释说明处理其他工具中的残破序列化。我不知道这是什么意思。在我看来,所有代码都要做的是确保存储在对象中的年表使用UTC时区。与根本不存储任何时间顺序相比,任何优势都让我感到失望。
这只是意味着我最终不得不通过调用来包装任何时区 ISOChronology.getInstance()看起来很麻烦:
new LocalTime(18,ISOChronology.getInstance(DateTimeZone.forID("America/New_York")))
LocalTime
对象无论如何都会忽略时区。您使用的构造函数的文档说:
使用指定的值构造一个设置为指定时间的实例 年表,其区域被忽略。
所以我认为您也可以使用:
new LocalTime(18,0)
如果需要指定秒和/或毫秒,则可以提供三个或四个参数。 LocalTime
类共有13个构造函数可供选择。
演示(并使您失望):
LocalTime timeInNewYork = new LocalTime(18,ISOChronology.getInstance(DateTimeZone.forID("America/New_York")));
System.out.println(timeInNewYork.getChronology().getZone());
输出:
UTC
要更直接地回答标题中的问题,Chronology
类用于处理不同的日历系统,例如伊斯兰或佛教日历,这与DateTimeZone
有所不同。而且在LocalTime
的上下文中似乎并不需要立即执行某些操作,因此有充分的理由提出您的问题。
进一步的观察是,受Joda-Time启发的现代Java日期和时间API java.time完全分离了时间顺序和时区的概念。 java.time年表不包含时区。同样,java.time LocalTime
对象既不使用时间顺序也不使用时区(除了其静态now
方法非常合理地接受ZoneId
参数;我认为这是不同的说法)。 / p>
如何解决?
那么我们如何与Joda创建一个可识别时区的
LocalTime
?
编辑:这将产生多大的意义?对于每天在某个时区的特定时间发生的事件?当然,如果您要设计一个日历系统,您需要在其中存储一个事件,例如,发生在智利圣地亚哥每天16:00发生的事件,以及发生在纽约纽约每天18:00发生的另一个事件。你知道,我不知道。
要回答,据我所知,您不能。 LocalTime
中的 local 表示无时区(虽然不明显,但确实如此)。
如果是我,则将一天中的时间分别存储在LocalTime
中,并将时区存储在DateTimeZone
中。这将为您提供所需的数据。您可以将这两部分包装到自己的类中,例如Time
或ZonedTime
类。
java.time提供了一个OffsetTime
类,一个带有偏移量的时间。因此,它不是时区识别时间,而只是UTC偏移量识别时间。不知道这对您是否有帮助,只是认为值得一提。
链接
- Joda-Time
Chronology
documentation - Joda-Time
LocalTime
documentation - java.time
OffsetTime
documentation