在查看java 8 Time API时,我看到许多方法期望作为参数ChronoUnit(TemporalUnit的实现)在这里,而其他人期望ChronoField(TemporalField的实现)在这里.
当一个方法期望使用ChronoUnit和ChronoField以及它们的区别时,是否有人可以帮助我澄清设计者的决定?
谢谢.
单位是用来衡量一个量的时间-年,月,日,时,分,秒.例如,第二个是SI单位.
相比之下,领域是人类通常所指的时间,这部分是时间.如果您查看数字时钟,秒数将从0到59再次计数,然后再次返回0.这是一个字段 - 在这种情况下是"秒分钟",通过在一分钟内计算秒数形成.同样,天数在一个月内计算,一年在一年内计算.要在时间线上定义完整点,您必须拥有一组链接字段,例如:
第二的分钟
微小的小时
小时的天
天的日
个月的一年
年(永远)
该ChronoField
API暴露的第二的分钟的两个部分.使用getBaseUnit()
获得"秒",并getRangeUnit()
获得"分钟".
Chrono
名称的一部分是指定义是按时间顺序排列的.具体而言,这意味着单元或字段仅在与日历系统关联时具有意义,或者Chronology
.这方面的一个例子是科普特年表,一年有13个月.尽管这与普通的民用/ ISO日历系统不同,但ChronoField.MONTH_OF_YEAR
仍然可以使用该常数.
的TemporalUnit
和TemporalField
接口提供更高级别的抽象,使得单位/字段未年表中性添加和处理.
A TemporalUnit
用作时间测量的通用单位。因此,它可以用于确定两个给定时间点之间的时间量大小(抽象意义上)。
但是,a TemporalField
不一定与任何种类的(抽象)时间轴相关,通常代表时间点的详细值。示例:一个月只是完整日历日期的一个组成部分,该日期包括年,月和日。
有人可能会认为日历月和月份单位或多或少可以被解释为等同。较旧的图书馆,例如java.util.Calendar
这样的并没有什么不同。但是,字段和单位的使用方式与上面显示的方式非常不同(组成时间点与测量时间量)。
有趣的是,JDK-8设计人员已决定一个字段必须具有不为null 的基本单位(我个人对此缩小的决定感到不满意,因为我可以想象其他字段不一定具有基本单位)。在几个月的情况下,这是微不足道的。对于天数,我们有不同的字段,它们的基本单位为DAYS,例如每月的某天,每年的某天,每周的某天。这种1:n关系证明了在JSR-310(又名java.time-package)的上下文中单元和字段的分离是正确的。