【问题标题】: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() 不是有意义吗?

【问题讨论】:

    标签: java timezone java-time jsr310


    【解决方案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 无法提供时区,则以下方法均无法正常工作:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-12-17
      • 2012-12-20
      • 2011-01-20
      • 1970-01-01
      • 1970-01-01
      • 2012-12-04
      • 2015-08-14
      • 2018-07-06
      相关资源
      最近更新 更多