java.time.temporal.ChronoUnit VS java.time.temporal.ChronoField
java.time.temporal.ChronoUnit VS java.time.temporal.ChronoField
在查看 java 8 次 API 时,我看到很多方法都期望作为参数 ChronoUnit (implementation of TemporalUnit) as here while other expect a ChronoField (implementation of TemporalField) as here。
任何人都可以帮助我阐明设计者的决定,何时期望使用 ChronoUnit 以及何时使用 ChronoField,它们有什么区别?
谢谢。
A TemporalUnit
用作通用的时间测量单位。因此它可以用于确定两个给定时间点之间的size of temporal amount(在抽象意义上)。
然而,TemporalField
不一定与任何一种(抽象的)时间轴相关,通常代表一个时间点的详细值。示例:月份只是完整日历日期的一个组成部分,该日历日期由年月日组成。
有些人可能会争辩说日历月和月份单位可以或多或少地解释为等同的。 java.util.Calendar
等较旧的库不会造成这种差异。但是,如上所示,字段和单位的使用方式非常不同(组成时间点与测量时间量)。
有趣的是,JDK-8-设计者决定一个字段必须有一个不为空的 base unit(我个人对这个缩小的决定不满意,因为我可以想象其他字段不一定有基本单元)。在几个月的情况下,这是非常微不足道的。 对于天,我们有具有相同基本单位 DAYS 的不同字段,例如月中日、年中日、星期中。这种 1:n-关系证明了在 JSR-310(又名 java.time-包)上下文中单元和字段的分离。
单位用于衡量数量 的时间 - 年、月、日、小时、分钟、秒。例如,第二个是 SI unit.
相比之下,字段是人类通常指代时间的方式,它以 部分 为单位。如果你看一个数字时钟,秒数从 0 到 59,然后再回到 0。这是一个 字段 - "second-of-minute" 在这种情况下,通过计算一分钟内的秒数形成。同样,一个月内计算天数,一年内计算月数。要在时间线上定义一个完整的点,您必须有一组链接字段,例如:
- 第二分钟
- 每小时
- 一天中的小时
- 每月第几天
- 年月
- 年(-永远)
ChronoField
API 公开了秒的两个部分。使用 getBaseUnit()
得到 "seconds" 和 getRangeUnit()
得到 "minutes".
名称的 Chrono
部分指的是定义与时间顺序无关。具体来说,这意味着单位或字段只有在与日历系统相关联时才有意义,即 Chronology
。这方面的一个例子是科普特年表,其中一年有 13 个月。尽管这与常见的 civil/ISO 日历系统不同,但仍然可以使用 ChronoField.MONTH_OF_YEAR
常量。
TemporalUnit
和 TemporalField
接口提供更高级别的抽象,允许添加和处理与时间无关的 units/fields。
在查看 java 8 次 API 时,我看到很多方法都期望作为参数 ChronoUnit (implementation of TemporalUnit) as here while other expect a ChronoField (implementation of TemporalField) as here。
任何人都可以帮助我阐明设计者的决定,何时期望使用 ChronoUnit 以及何时使用 ChronoField,它们有什么区别?
谢谢。
A TemporalUnit
用作通用的时间测量单位。因此它可以用于确定两个给定时间点之间的size of temporal amount(在抽象意义上)。
然而,TemporalField
不一定与任何一种(抽象的)时间轴相关,通常代表一个时间点的详细值。示例:月份只是完整日历日期的一个组成部分,该日历日期由年月日组成。
有些人可能会争辩说日历月和月份单位可以或多或少地解释为等同的。 java.util.Calendar
等较旧的库不会造成这种差异。但是,如上所示,字段和单位的使用方式非常不同(组成时间点与测量时间量)。
有趣的是,JDK-8-设计者决定一个字段必须有一个不为空的 base unit(我个人对这个缩小的决定不满意,因为我可以想象其他字段不一定有基本单元)。在几个月的情况下,这是非常微不足道的。 对于天,我们有具有相同基本单位 DAYS 的不同字段,例如月中日、年中日、星期中。这种 1:n-关系证明了在 JSR-310(又名 java.time-包)上下文中单元和字段的分离。
单位用于衡量数量 的时间 - 年、月、日、小时、分钟、秒。例如,第二个是 SI unit.
相比之下,字段是人类通常指代时间的方式,它以 部分 为单位。如果你看一个数字时钟,秒数从 0 到 59,然后再回到 0。这是一个 字段 - "second-of-minute" 在这种情况下,通过计算一分钟内的秒数形成。同样,一个月内计算天数,一年内计算月数。要在时间线上定义一个完整的点,您必须有一组链接字段,例如:
- 第二分钟
- 每小时
- 一天中的小时
- 每月第几天
- 年月
- 年(-永远)
ChronoField
API 公开了秒的两个部分。使用 getBaseUnit()
得到 "seconds" 和 getRangeUnit()
得到 "minutes".
名称的 Chrono
部分指的是定义与时间顺序无关。具体来说,这意味着单位或字段只有在与日历系统相关联时才有意义,即 Chronology
。这方面的一个例子是科普特年表,其中一年有 13 个月。尽管这与常见的 civil/ISO 日历系统不同,但仍然可以使用 ChronoField.MONTH_OF_YEAR
常量。
TemporalUnit
和 TemporalField
接口提供更高级别的抽象,允许添加和处理与时间无关的 units/fields。