-
- All Known Subinterfaces:
-
ChronoLocalDate
,ChronoLocalDateTime<D>
,ChronoZonedDateTime<D>
,Era
,Temporal
- 所有已知实现类:
-
DayOfWeek
,HijrahDate
,HijrahEra
,Instant
,IsoEra
,JapaneseDate
,JapaneseEra
,LocalDate
,LocalDateTime
,LocalTime
,MinguoDate
,MinguoEra
,Month
,MonthDay
,OffsetDateTime
,OffsetTime
,ThaiBuddhistDate
,ThaiBuddhistEra
,Year
,YearMonth
,ZonedDateTime
,ZoneOffset
public interface TemporalAccessor
框架级接口定义对时间对象的只读访问,例如日期,时间,偏移或这些的某些组合。这是日期,时间和偏移对象的基本界面类型。 这些类可以提供fields或queries的信息 。
大多数日期和时间信息可以表示为一个数字。 这些是使用模拟
TemporalField
使用保持的号码long
处理大值。 年份,月份和日期是字段的简单示例,但它们还包括即时和偏移量。 有关标准的字段集,请参阅ChronoField
。两个日期/时间信息不能用数字表示, chronology和time-zone 。 这些可以通过queries使用
TemporalQuery
上定义的静态方法访问 。子接口
Temporal
将此定义扩展到也支持对更完整的时间对象进行调整和操纵的定义。该接口是一个框架级接口,不应该在应用程序代码中广泛使用。 相反,应用程序应该创建并传递具体类型的实例,如
LocalDate
。 这有很多原因,其中一部分是该接口的实现可能在除ISO之外的日历系统中。 有关这些问题的更全面的讨论,请参阅ChronoLocalDate
。- 实现要求:
- 此接口对实现的可变性没有任何限制,但是强烈建议不变性。
- 从以下版本开始:
- 1.8
-
-
方法摘要
所有方法 接口方法 抽象方法 Default Methods Modifier and Type 方法 描述 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)
获取指定字段的有效值的范围。
-
-
-
方法详细信息
-
isSupported
boolean isSupported(TemporalField field)
- 实现要求:
-
实现必须检查并处理
ChronoField
中定义的所有字段。 如果该字段被支持,则必须返回true,否则返回false。如果该字段是不是一个
ChronoField
,则此方法的结果是通过调用得到TemporalField.isSupportedBy(TemporalAccessor)
传递this
作为参数。当这个只读方法被调用时,实现必须确保没有可观察的状态被改变。
- 参数
-
field
- 要检查的字段,null返回false - 结果
- 如果可以查询该字段的日期时间,则为true,否则为false
-
range
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 - 结果
- 字段的有效值的范围不为null
- 异常
-
DateTimeException
- 如果无法获取字段的范围 -
UnsupportedTemporalTypeException
- 如果该字段不被支持
-
get
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
- 如果发生数字溢出
-
getLong
long getLong(TemporalField field)
获取指定字段的long
。这将查询指定字段的值的日期时间。 返回的值可能在该字段的值的有效范围之外。 如果日期时间不能返回值,因为该字段不受支持或由于其他原因,将抛出异常。
- 实现要求:
-
实现必须检查并处理
ChronoField
中定义的所有字段。 如果该字段被支持,则必须返回该字段的值。 如果不支持,则必须抛出一个UnsupportedTemporalTypeException
。如果该字段是不是一个
ChronoField
,则此方法的结果是通过调用得到TemporalField.getFrom(TemporalAccessor)
传递this
作为参数。当这个只读方法被调用时,实现必须确保没有可观察的状态被改变。
- 参数
-
field
- 要获取的字段,不为null - 结果
- 该字段的值
- 异常
-
DateTimeException
- 如果无法获取字段的值 -
UnsupportedTemporalTypeException
- 如果该字段不被支持 -
ArithmeticException
- 如果发生数字溢出
-
query
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类提供与默认行为相同的行为,则JDK类可能会避免调用super,但是非JDK类可能无法使用此优化,并且必须调用super
。如果实现可以为默认实现的if语句中列出的查询之一提供一个值,那么它必须这样做。 例如,存储小时和分钟的应用程序定义的
HourMin
类必须重写此方法,如下所示:if (query == TemporalQueries.precision()) { return MINUTES; } return TemporalAccessor.super.query(query);
当这个只读方法被调用时,实现必须确保没有可观察的状态被改变。
- 参数类型
-
R
- 结果的类型 - 参数
-
query
- 要调用的查询,不为空 - 结果
- 查询结果可能返回null(由查询定义)
- 异常
-
DateTimeException
- 如果无法查询 -
ArithmeticException
- 如果发生数字溢出
-
-