public interface TemporalUnit
时间的测量建立在单位上,如年,月,日,小时,分钟和秒。 该接口的实现表示这些单元。
该接口的一个实例表示单元本身,而不是单元的数量。 参见Period
对于以公共单位计的数额的类。
最常用的单位在ChronoUnit
中定义。 其他单位提供在IsoFields
。 单元也可以通过应用程序代码来实现这个接口。
该单位使用双重调度工作。 客户端代码调用日期时间的方法,如LocalDateTime
,它检查该单元是否是ChronoUnit
。 如果是,则日期时间必须处理它。 否则,方法调用将重新分配到此接口中的匹配方法。
Modifier and Type | Method and Description |
---|---|
<R extends Temporal> |
addTo(R temporal, long amount)
返回添加指定句点的指定时间对象的副本。
|
long |
between(Temporal temporal1Inclusive, Temporal temporal2Exclusive)
计算两个时间对象之间的时间量。
|
Duration |
getDuration()
获取此单位的持续时间,这可能是一个估计。
|
boolean |
isDateBased()
检查本机是否代表日期的组成部分。
|
boolean |
isDurationEstimated()
检查单位的持续时间是否是估计。
|
default boolean |
isSupportedBy(Temporal temporal)
检查本机是否受指定的时间对象的支持。
|
boolean |
isTimeBased()
检查本机是否代表时间的一个组成部分。
|
String |
toString()
获取单位的描述性名称。
|
Duration getDuration()
所有单位返回从该方法测量的标准纳秒的持续时间。 持续时间将为正且非零。 例如,一小时的持续时间为60 * 60 * 1,000,000,000ns
。
有些单位可能返回准确的持续时间,而其他单位可能返回估计。 例如,由于夏令时更改的可能性,天数估计有效。 要确定持续时间是否是估计值,请使用isDurationEstimated()
。
boolean isDurationEstimated()
所有单位都有持续时间,但持续时间并不总是准确的。 例如,由于夏令时更改的可能性,天数估计有效。 如果持续时间是估计值,则此方法返回true,如果是准确的则返回false。 请注意,准确/估计忽略闰秒。
boolean isDateBased()
日期是以时间为基础的,如果它可以用来暗示日期的含义。 它必须有一个duration是标准日的长度的整数倍。 请注意,对于isDateBased()
和isTimeBased()
可以返回false,例如当表示36小时的单位时。
boolean isTimeBased()
一个单位是基于时间的,如果它可以用来暗示一段时间的意义。 它必须有一个duration分为标准日期的长度,没有余数。 请注意,对于isDateBased()
和isTimeBased()
可以返回false,例如当表示36小时的单位时。
default boolean isSupportedBy(Temporal temporal)
temporal
- 要检查的时间对象,不为空
<R extends Temporal> R addTo(R temporal, long amount)
增加的时间是这个单位的倍数。 例如,通过在表示“days”的实例上调用该方法,传递日期和期间“3”,可以使用此方法添加“3天”。 要添加的时间可以是负数,这相当于减法。
使用这种方法有两种等效的方法。 第一个是直接调用这个方法。 二是使用Temporal.plus(long, TemporalUnit)
:
// these two lines are equivalent, but the second approach is recommended
temporal = thisUnit.addTo(temporal);
temporal = temporal.plus(thisUnit);
建议使用第二种方法, plus(TemporalUnit)
,因为在代码中阅读更清楚。
实现应该执行使用可用的单位有任何疑问或计算ChronoUnit
或可用字段ChronoField
。 如果不支持本机,则必须抛出UnsupportedTemporalTypeException
。
实现不能改变指定的时间对象。 相反,必须退还原件的调整副本。 这为不可变和可变的实现提供了相当的安全行为。
R
- 时间对象的类型
temporal
- 要调整的时间对象,不为null
amount
- 此单位的数量,添加,正或负
DateTimeException
- 如果不能添加期间
UnsupportedTemporalTypeException
- 如果单位不受时间支持
long between(Temporal temporal1Inclusive, Temporal temporal2Exclusive)
这计算出这个单位的数量。 起始点和终点作为时间对象提供,并且必须是兼容类型。 实施将在计算数量之前将第二类型转换为第一类的实例。 如果结束在开始之前,结果将为负数。 例如,可以使用HOURS.between(startTime, endTime)
两个时间对象之间的小时数。
计算返回一个整数,表示两个时间之间的完整单位数。 例如,11时30分至13时29分之间的小时数将只有1小时,因为距离两小时不到1分钟。
使用这种方法有两种等效的方法。 第一个是直接调用这个方法。 二是使用Temporal.until(Temporal, TemporalUnit)
:
// these two lines are equivalent
between = thisUnit.between(start, end);
between = start.until(end, thisUnit);
应该根据这种做法进行选择,使代码更易读。
例如,该方法允许计算两个日期之间的天数:
long daysBetween = DAYS.between(start, end);
// or alternatively
long daysBetween = start.until(end, DAYS);
实现应该执行使用可用的单位有任何疑问或计算ChronoUnit
或可用字段ChronoField
。 如果不支持该单元,则必须抛出UnsupportedTemporalTypeException
。 实现不能改变指定的时间对象。
getClass()
。
如果没有,则必须通过致电temporal1Inclusive.until(temporal2Exclusive, this)
获得结果。
temporal1Inclusive
- 基础时间对象,不为null
temporal2Exclusive
- 其他时间对象,排他,不为空
DateTimeException
- 如果不能计算金额,或者结束时间不能转换为与开始时间相同的类型
UnsupportedTemporalTypeException
- 如果单位不受时间支持
ArithmeticException
- 如果发生数字溢出