为什么 java.time.Clock 有区域信息?备用时钟行为

2022-09-04 03:29:13

为什么有区域信息?从时钟中,您只能在调用方法时获得 - 这是一个没有区域信息的时间。java.time.ClockInstantinstant()

在时钟中提供区域的唯一目的是创建像这样的ZonedDateTime吗?ZonedDateTime.ofInstant(clock().instant(), clock().getZone())

那么在时钟类中有一个方法不是有意义吗?zonedDateTime()


答案 1

备用时钟行为

引用时钟文档(强调我的):

时钟的使用是可选的。所有关键日期时间类还具有 now() 工厂方法,该方法使用默认时区的系统时钟。此抽象的主要目的是允许在需要时插入备用时钟。应用程序使用对象来获取当前时间,而不是静态方法。这可以简化测试。

例如,Clock.fixed(Instant fixedInstant,ZoneId zone)始终将当前时刻报告为特定时刻,即固定(不变)的时间点。


答案 2

我想这需要一点读心术或猜测来回答你的问题,但无论如何让我试试。据我所知,在使用任何一种参数方法时,知道时区都非常方便。如果 无法提供时区,则以下方法均无法正常工作:ClocknowClockClock

该列表可能不完整。只有 Instant.now(时钟) 不需要时区,并忽略 .Clock

是的,替代设计有一种方法提供与同样有意义的结果相同的结果。但是:想要开发类的人永远无法将方法插入到类中。使用现有设计,他们可以按照与现有日期和时间类完全相同的思路设计其类,包括方法。ClockzonedDateTimeZonedDateTime.now(Clock)JewishDatejewishDateClockJewishDateJewishDate.now(Clock)


推荐