为啥 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 有区域信息?的主要内容,如果未能解决你的问题,请参考以下文章