-
- 所有已知实现类:
-
ChronoUnit
public interface TemporalUnit
日期时间单位,例如天或小时。时间的测量建立在单位上,例如年,月,日,小时,分钟和秒。 此接口的实现表示这些单元。
此接口的实例表示单元本身,而不是单元的数量。 有关以通用单位表示金额的类,请参阅
Period
。最常用的单位在
ChronoUnit
中定义。 更多装置供应IsoFields
。 通过实现此接口,还可以通过应用程序代码编写单元。该单位使用双重调度。 客户端代码调用日期时间方法,如
LocalDateTime
,检查单位是否为ChronoUnit
。 如果是,那么日期时间必须处理它。 否则,将方法调用重新分派到此接口中的匹配方法。- 实现要求:
- 必须小心实现此接口,以确保其他类正常运行。 可以实例化的所有实现必须是最终的,不可变的和线程安全的。 建议尽可能使用枚举。
- 从以下版本开始:
- 1.8
-
-
方法摘要
所有方法 实例方法 抽象方法 Default Methods 变量和类型 方法 描述 <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。 请注意,准确/估计忽略闰秒。
- 结果
- 如果估计持续时间则为true,如果准确则为false
-
isDateBased
boolean isDateBased()
检查此单位是否代表日期的组成部分。如果日期可用于暗示日期的含义,则日期是基于时间的。 它必须具有duration ,它是标准日长度的整数倍。 请注意,它对
isDateBased()
和isTimeBased()
都有效,返回false,例如表示36小时的单位时。- 结果
- 如果此单位是日期的组成部分,则为true
-
isTimeBased
boolean isTimeBased()
检查此单位是否代表某个时间的组成部分。单位是基于时间的,如果它可以用来暗示一时的含义。 它必须有一个duration ,它分为标准日的长度,没有余数。 请注意,它对
isDateBased()
和isTimeBased()
都有效,返回false,例如代表36小时的单位时。- 结果
- 如果此单位是时间的组成部分,则为true
-
isSupportedBy
default boolean isSupportedBy(Temporal temporal)
- 参数
-
temporal
- 要检查的临时对象,而不是null - 结果
- 如果支持该单位,则为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)
,因为在代码中读取要清楚plus(TemporalUnit)
。实现应使用
ChronoUnit
中可用的单位或ChronoField
中提供的字段执行任何查询或计算。 如果不支持该装置,则必须抛出UnsupportedTemporalTypeException
。实现不得更改指定的时态对象。 相反,必须返回原始的调整副本。 这为不可变和可变实现提供了等效的安全行为。
- 参数类型
-
R
- 临时对象的类型 - 参数
-
temporal
- 要调整的时态对象,而不是null -
amount
- 要添加的单位数量,正数或负数 - 结果
- 调整后的时态对象,不为空
- 异常
-
DateTimeException
- 如果金额无法添加 -
UnsupportedTemporalTypeException
- 如果时间不支持该单位
-
between
long between(Temporal temporal1Inclusive, Temporal temporal2Exclusive)
计算两个临时对象之间的时间量。这将根据此单位计算金额。 起点和终点作为临时对象提供,并且必须是兼容类型。 在计算金额之前,实现将第二种类型转换为第一种类型的实例。 如果结束在开始之前,结果将是否定的。 例如,可以使用
HOURS.between(startTime, endTime)
计算两个临时对象之间的小时HOURS.between(startTime, endTime)
。计算返回一个整数,表示两个时间之间的完整单位数。 例如,11:30到13:29之间的小时数仅为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
- 另一个临时对象,独占,非空 - 结果
- 以该单位表示的temporal1Inclusive和temporal2Exclusive之间的时间量; 如果temporal2Exclusive晚于temporal1Inclusive,则为positive,如果更早则为negative
- 异常
-
DateTimeException
- 如果无法计算金额,或者结束时间不能转换为与开始时间相同的类型 -
UnsupportedTemporalTypeException
- 如果时间不支持该单位 -
ArithmeticException
- 如果发生数字溢出
-
-