为啥 java.time.Clock 有区域信息?

Posted

技术标签:

【中文标题】为啥 java.time.Clock 有区域信息?【英文标题】:Why does the java.time.Clock has zone information?为什么 java.time.Clock 有区域信息? 【发布时间】:2019-04-30 06:27:01 【问题描述】:

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

唯一的目的是让该区域在时钟中可用,例如像这样创建 ZonedDateTime? ZonedDateTime.ofInstant(clock().instant(), clock().getZone())

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

【问题讨论】:

【参考方案1】:

备用时钟行为

引用Clock 文档(强调我的):

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

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

【讨论】:

你是对的。采用时钟的 ZoneDateTime 的 now() 实现如下所示:` public static ZonedDateTime now(Clock clock) return ofInstant(clock.instant(), clock.getZone()); `【参考方案2】:

我想回答你的问题需要花点心思或猜测,但还是让我试试吧。据我所知,Clock 知道时区在使用任何带有Clock 参数的now 方法时非常方便。如果Clock 无法提供时区,则以下方法均无法正常工作:

LocalDate.now(Clock) LocalDateTime.now(Clock) LocalTime.now(Clock) MonthDay.now(Clock) OffsetDateTime.now(Clock) OffsetTime.now(Clock) Year.now(Clock) YearMonth.now(Clock) ZonedDateTime.now(Clock) HijrahDate.now(Clock) JapaneseDate.now(Clock) MinguoDate.now(Clock) ThaiBuddhistDate.now(Clock)

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

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

【讨论】:

以上是关于为啥 java.time.Clock 有区域信息?的主要内容,如果未能解决你的问题,请参考以下文章

DNS为啥既使用TCP又使用UDP,二者有啥不同?

为啥 pytz 似乎没有任何时区信息?

当我们有一个红色区域时,为啥我们需要堆栈分配?

为啥UIButton高亮区域那么小?

gis镶嵌中一个影像有黑底是为啥

根据光流,为啥图像边缘有剧烈运动?