在查看Java8TimeAPI时,我看到很多方法都将expect作为参数ChronoUnit (TemporalUnit的实现)作为这里,而其他方法则将ChronoField (TemporalField的实现)看作这里。
有谁能帮我澄清一下设计人员在什么时候决定什么时候使用ChronoUnit和什么时候使用ChronoField,他们有什么区别?
谢谢。
发布于 2017-01-10 19:21:57
单位是用来测量的时间-年,月,天,小时,分钟,秒的数量。例如,第二个是硅单元。
相比之下,场是人类通常指时间的方式,它是分部分的。如果您查看一个数字时钟,秒数从0到59,然后再回到0。在这种情况下,这是一个“第二分钟”字段,由一分钟内的秒数而成。同样,天数在一个月内计算,几个月在一年内计算。要在时间线上定义一个完整的点,您必须有一组链接字段,例如:
ChronoField API公开了第二分钟的两个部分.使用getBaseUnit()获取“秒”,使用getRangeUnit()获取“分钟”。
名称的Chrono部分指的是定义是时间无关的事实。具体来说,这意味着该单元或字段只有在与日历系统或Chronology相关联时才有意义。这方面的一个例子是科普特年表,一年有13个月。尽管这与普通的民用/ISO日历系统不同,但仍然可以使用ChronoField.MONTH_OF_YEAR常量。
TemporalUnit和TemporalField接口提供了更高级别的抽象,允许添加和处理非时序无关的单元/字段。
发布于 2017-01-10 15:44:42
TemporalUnit作为时间测量的一般单位。因此,它可以用于确定两个给定时间点之间的时间数量大小 (抽象意义上的)。
然而,TemporalField不一定与任何类型的(抽象的)时间轴相关,通常表示一个时间点的细节值。一个月只是一个完整的日历日期的一个组成部分,它由年、月和日组成.
有些人可能会争辩说,一个日历月和一个月单位可以或多或少地解释为等同的。像java.util.Calendar这样的旧库不会产生这种影响。然而,字段和单元的使用方式非常不同,如上面所示(构成时间点相对于测量时间数量)。
有趣的是,JDK-8-设计者已经决定一个字段必须有一个非空的基本单元 (我个人对这个缩小的决定不满意,因为我可以想象其他字段不一定有一个基本单位)。如果是几个月,这是相当微不足道的。在天的情况下,我们有不同的字段,具有相同的基单元日(),例如,月一天、一年一天、一周一天。这种1:n关系证明了JSR-310 ( java.time-package)上下文中单元和字段的分离是合理的。
https://stackoverflow.com/questions/41571974
复制相似问题