public interface TemporalAccessor
这是日期,时间和偏移对象的基本界面类型。 这些类可以提供信息fields或queries来实现 。
大多数日期和时间信息可以表示为一个数字。 这些是使用模拟TemporalField
使用保持的数long
处理大值。 年份,月份和日期是字段的简单示例,但它们还包括即时和偏移量。 有关标准的字段集,请参见ChronoField
。
两个日期/时间信息不能由数字, chronology和time-zone表示 。 这些可以通过以下方式访问queries使用上定义的静态方法TemporalQuery
。
子接口Temporal
将此定义扩展到也支持对更完整的时间对象进行调整和操纵的定义。
该接口是一个框架级接口,不应该在应用程序代码中广泛使用。 相反,应用程序应该创建并传递具体类型的LocalDate
,例如LocalDate
。 这有很多原因,其中一部分是该接口的实现可能在除ISO之外的日历系统中。 有关这些问题的更全面的讨论,请参阅ChronoLocalDate
。
Modifier and Type | Method and Description |
---|---|
default int |
get(TemporalField field)
获取指定字段的
int 。
|
long |
getLong(TemporalField field)
获取指定字段的
long 。
|
boolean |
isSupported(TemporalField field)
检查指定的字段是否受支持。
|
default <R> R |
query(TemporalQuery<R> query)
查询此日期时间。
|
default ValueRange |
range(TemporalField field)
获取指定字段的有效值的范围。
|
boolean isSupported(TemporalField field)
ChronoField
中定义的所有字段。
如果该字段被支持,则必须返回true,否则返回false。
如果该字段是不是一个ChronoField
,则此方法的结果是通过调用获得TemporalField.isSupportedBy(TemporalAccessor)
传递this
作为参数。
当这个只读方法被调用时,实现必须确保没有可观察的状态被改变。
field
- 要检查的字段,null返回false
default ValueRange range(TemporalField field)
所有字段可以表示为long
整数。 此方法返回描述该值的有效范围的对象。 该时间对象的值用于提高返回范围的精度。 如果日期时间无法返回范围,因为该字段不受支持或由于其他原因,将抛出异常。
请注意,结果仅描述最小和最大有效值,重要的是不要太多读取它们。 例如,可以在该范围内的值对该字段无效。
ChronoField
中定义的所有字段。
如果该字段被支持,则必须返回该字段的范围。
如果不支持,则必须抛出一个UnsupportedTemporalTypeException
。
如果该字段是不是一个ChronoField
,则此方法的结果是通过调用获得TemporalField.rangeRefinedBy(TemporalAccessorl)
传递this
作为参数。
当这个只读方法被调用时,实现必须确保没有可观察的状态被改变。
默认实现必须与此代码相同:
if (field instanceof ChronoField) {
if (isSupported(field)) {
return field.range();
}
throw new UnsupportedTemporalTypeException("Unsupported field: " + field);
}
return field.rangeRefinedBy(this);
field
- 查询范围的字段,不为null
DateTimeException
- 如果无法获取字段的范围
UnsupportedTemporalTypeException
- 如果该字段不被支持
default int get(TemporalField field)
int
。
这将查询指定字段的值的日期时间。 返回的值将始终在该字段的值的有效范围内。 如果日期时间不能返回值,因为该字段不受支持或由于其他原因,将抛出异常。
ChronoField
中定义的所有字段。
如果该字段被支持并具有int
范围,则必须返回该字段的值。
如果不支持,则必须抛出一个UnsupportedTemporalTypeException
。
如果该字段是不是一个ChronoField
,则此方法的结果是通过调用获得TemporalField.getFrom(TemporalAccessor)
传递this
作为参数。
当这个只读方法被调用时,实现必须确保没有可观察的状态被改变。
默认实现必须与此代码相同:
if (range(field).isIntValue()) {
return range(field).checkValidIntValue(getLong(field), field);
}
throw new UnsupportedTemporalTypeException("Invalid field " + field + " + for get() method, use getLong() instead");
field
- 要获取的字段,不为null
DateTimeException
- 如果无法获取字段的值,或者该值超出了该字段的有效值的范围
UnsupportedTemporalTypeException
- 如果该字段不被支持或值范围超过
int
ArithmeticException
- 如果发生数字溢出
long getLong(TemporalField field)
long
。
这将查询指定字段的值的日期时间。 返回的值可能在该字段的值的有效范围之外。 如果日期时间不能返回值,因为该字段不受支持或由于其他原因,将抛出异常。
ChronoField
中定义的所有字段。
如果该字段被支持,则必须返回该字段的值。
如果不支持,则必须抛出一个UnsupportedTemporalTypeException
。
如果该字段不是ChronoField
,则该方法的结果是通过调用TemporalField.getFrom(TemporalAccessor)
this
作为参数的this
获得的。
当这个只读方法被调用时,实现必须确保没有可观察的状态被改变。
field
- 要获取的字段,不为null
DateTimeException
- 如果无法获取字段的值
UnsupportedTemporalTypeException
- 如果该字段不被支持
ArithmeticException
- 如果发生数字溢出
default <R> R query(TemporalQuery<R> query)
这将使用指定的查询策略对象查询此日期时间。
查询是从日期时间提取信息的关键工具。 它们存在于外部化查询过程,根据策略设计模式允许不同的方法。 示例可能是一个查询,检查日期是闰年前的二月二十九日前一天,还是计算下一个生日的天数。
最常见的查询实现是方法引用,例如LocalDate::from
和ZoneId::from
。 另外的实施方式被提供作为在静态方法TemporalQuery
。
if (query == TemporalQueries.zoneId() ||
query == TemporalQueries.chronology() || query == TemporalQueries.precision()) {
return null;
}
return query.queryFrom(this);
未来版本被允许向if语句添加进一步的查询。
实现此接口并覆盖此方法的所有类都必须调用TemporalAccessor.super.query(query)
。 如果JDK类提供与默认行为相同的行为,则可能会避免调用super,但是非JDK类可能无法使用此优化,并且必须调用super
。
如果实现可以为默认实现的if语句中列出的查询之一提供一个值,那么它必须这样做。 例如,存储小时和分钟的应用程序定义的HourMin
类必须重写此方法,如下所示:
if (query == TemporalQueries.precision()) {
return MINUTES;
}
return TemporalAccessor.super.query(query);
当这个只读方法被调用时,实现必须确保没有可观察的状态被改变。
R
- 结果的类型
query
- 要调用的查询,不为null
DateTimeException
- 如果无法查询
ArithmeticException
- 如果发生数字溢出