-
- 所有已知实现类:
-
ChronoUnit
public interface TemporalUnit
日期时间单位,如天数或小时数。时间的测量建立在单位上,如年,月,日,小时,分钟和秒。 该接口的实现表示这些单元。
该接口的一个实例表示单元本身,而不是单元的数量。 请参阅
Period
,表示以公用单位计的金额。最常用的单位在
ChronoUnit
中定义。 其他单位提供IsoFields
。 单元也可以通过应用程序代码来实现这个接口。该单位使用双重调度工作。 客户端代码调用日期时间的方法,如
LocalDateTime
,检查单元是否为ChronoUnit
。 如果是,则日期时间必须处理它。 否则,方法调用将重新分配到此接口中的匹配方法。- 实现要求:
- 该接口必须小心实施,以确保其他类正确运行。 可以实例化的所有实现必须是最终的,不可变的和线程安全的。 建议尽可能使用枚举。
- 从以下版本开始:
- 1.8
-
-
方法摘要
所有方法 接口方法 抽象方法 Default Methods Modifier and Type 方法 描述 <R extends Temporal>
RaddTo(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()
获取单位的描述性名称。
-
-
-
方法详细信息
-
getDuration
Duration getDuration()
获取此单位的持续时间,这可能是一个估计。所有单位返回从该方法测量的标准纳秒的持续时间。 持续时间将为正且非零。 例如,一小时的持续时间为
60 * 60 * 1,000,000,000ns
。有些单位可能返回准确的持续时间,而其他单位可能返回估计。 例如,由于夏令时更改的可能性,天数估计有效。 要确定持续时间是否为估计值,请使用
isDurationEstimated()
。- 结果
- 该单位的持续时间(可能是估计)不为空
-
isDurationEstimated
boolean isDurationEstimated()
检查单位的持续时间是否是估计。所有单位都有持续时间,但持续时间并不总是准确的。 例如,由于夏令时更改的可能性,天数估计有效。 如果持续时间是估计值,则此方法返回true,如果是准确的则返回false。 请注意,准确/估计忽略闰秒。
- 结果
- 如果持续时间估计为真,则为真,如果准确
-
isDateBased
boolean isDateBased()
检查本机是否代表日期的组成部分。日期是以时间为基础的,如果它可以用来暗示日期的含义。 它必须有一个duration ,这是标准日的长度的整数倍。 请注意,
isDateBased()
和isTimeBased()
可以返回false,例如当36小时代表单位时。- 结果
- 如果此单位是日期的组成部分,则为真
-
isTimeBased
boolean isTimeBased()
检查本机是否代表时间的一个组成部分。一个单位是基于时间的,如果它可以用来暗示一段时间的意义。 它必须有一个duration ,分为标准日期的长度,没有余数。 请注意,对于
isDateBased()
和isTimeBased()
可以返回false,例如当表示36小时的单位时。- 结果
- 如果这个单位是时间的一个组成部分,则为真
-
isSupportedBy
default boolean isSupportedBy(Temporal temporal)
- 参数
-
temporal
- 要检查的时间对象,不为空 - 结果
- 如果设备支持,则为true
-
addTo
<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
- 要调整的时间对象,不为空 -
amount
- 要添加的单位数量,正数或负数 - 结果
- 调整后的时间对象,不为空
- 异常
-
DateTimeException
- 如果不能添加金额 -
UnsupportedTemporalTypeException
- 如果单位不受时间支持
-
between
long between(Temporal temporal1Inclusive, Temporal temporal2Exclusive)
计算两个时间对象之间的时间量。这计算出这个单位的数量。 起始点和终点作为时间对象提供,并且必须是兼容类型。 实施将在计算数量之前将第二类型转换为第一类的实例。 如果结束在开始之前,结果将为负数。 例如,可以使用
HOURS.between(startTime, endTime)
计算两个时间对象之间的小时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
- 基本的时间对象,不为空 -
temporal2Exclusive
- 其他时间对象,排他,不为空 - 结果
- 在本单位之间的temporal1Inclusive和temporal2独家之间的时间量; 如果temporal2Exclusive晚于temporal1Inclusive,则为正,如果更早则为负
- 异常
-
DateTimeException
- 如果不能计算金额,或者结束时间不能转换为与开始时间相同的类型 -
UnsupportedTemporalTypeException
- 如果单位不受时间支持 -
ArithmeticException
- 如果发生数字溢出
-
-