【问题标题】:why ZonedDateTime class does not implement TemporalAdjuster interface为什么 ZonedDateTime 类没有实现 TemporalAdjuster 接口
【发布时间】:2017-08-07 00:22:14
【问题描述】:

我目前正在研究 java.time API,我注意到 java.time 中的大多数类(例如LocalDateOffsetDateTime)实现了TemporalAdjuster 接口,但ZonedDateTime 没有。我只是想知道为什么会这样?为什么要排除ZonedDateTime 实现TemporalAdjuster 接口?

【问题讨论】:

  • 我认为原因在于接口的名称。 ZonedDateTime 不是用作修饰符,而是用作给定的“值”。同时,任何实现TemporalAdjuster 的东西都旨在调整其他“价值”对象。
  • 鉴于 OffsetDateTime 确实 实现了 TemporalAdjuster,我认为这与夏令时切换有关,并且不知道它们何时在 Temporal 上下文中发生。但在@JonSkeet 加入之前,我不会赌其他人知道正确答案。
  • @ErwinBolwidt 哈哈,没有 JonSkeet 我们怎么活

标签: java time java-8 java-time


【解决方案1】:

TemporalAdjuster 通过TemporalAdjuster.adjustInto(Temporal) 方法更改另一个时间对象。 Temporal 接口允许通过Temporal.with(TemporalField, long) 更改各个字段。

LocalDate 可以实现TemporalAdjuster,因为它的状态完全由时间字段(年、月、日)组成。因此,LocalDate.adjustInto(Temporal) 中的实现可以调用Temporal.with(TemporalField, long) 传递年、月和日(它实际上使用ChronoField.EPOCH_DAY,它是年、月和日的组合)。

OffsetDateTime 可以实现TemporalAdjuster,因为它的状态也完全由时间字段(年、月、日、小时、分钟、秒、纳秒和偏移秒)组成。因此,OffsetDateTime.adjustInto(Temporal) 中的实现再次可以调用 Temporal.with(TemporalField, long) 一个接一个地传递字段。

ZonedDateTime 不能实现TemporalAdjuster,因为它的状态包括一个ZoneId,它不是一个时间字段,因此不能传递给Temporal.with(TemporalField, long)。 IE。无法通过Temporal 接口更改时间类的时区。

鉴于ZonedDateTime 包含所有可能的日期时间字段,此限制在实践中几乎没有效果。

【讨论】:

  • 你能详细说明为什么ZoneId不是TemporalField吗?
  • 哇哦,真不敢相信我在和 JodaTime 的作者说话。感谢您先生,您对 JodaTime 和 java.time 的贡献。
  • TemporalField 用于引用long 数值。 ZoneId 实际上是 String。所以,ZoneId 不能实现 TemporalField
猜你喜欢
  • 2021-01-14
  • 1970-01-01
  • 1970-01-01
  • 2017-05-14
  • 2018-10-24
  • 2023-03-16
  • 1970-01-01
  • 2020-06-07
  • 2021-07-20
相关资源
最近更新 更多