-
- 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
定义对临时对象的只读访问的框架级接口,例如日期,时间,偏移或这些的某种组合。这是日期,时间和偏移对象的基本接口类型。 它由那些可以提供信息的类实现,如字段或queries 。
大多数日期和时间信息可以表示为数字。 这些使用
TemporalField
建模,使用TemporalField
保持long
以处理大值。 年,月和日是字段的简单示例,但它们还包括即时和偏移。 有关标准字段集,请参见ChronoField
。两条日期/时间信息不能用数字表示, chronology和time-zone 。 可以使用
TemporalQuery
上定义的静态方法通过queries访问这些文件 。子接口
Temporal
将此定义扩展为还支持对更完整的时态对象进行调整和操作的定义。此接口是框架级接口,不应在应用程序代码中广泛使用。 相反,应用程序应创建并传递具体类型的实例,例如
LocalDate
。 这有很多原因,其中一部分是此接口的实现可能在ISO之外的日历系统中。 有关问题的更全面讨论,请参见ChronoLocalDate
。- 实现要求:
- 此接口对实现的可变性没有任何限制,但强烈建议使用不变性。
- 从以下版本开始:
- 1.8
-
-
方法摘要
所有方法 实例方法 抽象方法 Default Methods 变量和类型 方法 描述 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
作为参数。实现必须确保在调用此只读方法时不会更改任何可观察状态。
- 参数
-
字段
- 要检查的字段,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);
- 参数
-
字段
- 要查询范围的字段,而不是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");
- 参数
-
字段
- 要获取的字段,而不是null - 结果
- 字段的值,在有效的值范围内
- 异常
-
DateTimeException
- 如果无法获取该字段的值或该值超出该字段的有效值范围 -
UnsupportedTemporalTypeException
- 如果不支持该字段或值的范围超过int
-
ArithmeticException
- 如果发生数字溢出
-
getLong
long getLong(TemporalField field)
获取指定字段的long
。这将查询指定字段值的日期时间。 返回的值可能超出字段的有效值范围。 如果日期时间无法返回该值,因为该字段不受支持或由于某些其他原因,将引发异常。
- 实现要求:
-
实现必须检查并处理
ChronoField
中定义的所有字段。 如果支持该字段,则必须返回该字段的值。 如果不受支持,则必须抛出UnsupportedTemporalTypeException
。如果该字段是不是一个
ChronoField
,则此方法的结果是通过调用获得TemporalField.getFrom(TemporalAccessor)
传递this
作为参数。实现必须确保在调用此只读方法时不会更改任何可观察状态。
- 参数
-
字段
- 要获取的字段,而不是null - 结果
- 该字段的值
- 异常
-
DateTimeException
- 如果无法获得该字段的值 -
UnsupportedTemporalTypeException
- 如果不支持该字段 -
ArithmeticException
- 如果发生数字溢出
-
query
default <R> R query(TemporalQuery<R> query)
查询此日期时间。这将使用指定的查询策略对象查询此日期时间。
查询是从日期时间提取信息的关键工具。 它们的存在是为了使查询过程外化,允许根据策略设计模式采用不同的方法。 示例可能是查询日期是否是闰年2月29日前一天的查询,或计算下一个生日的天数。
最常见的查询实现是方法引用,例如
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 - 结果
- 查询结果,可以返回null(由查询定义)
- 异常
-
DateTimeException
- 如果无法查询 -
ArithmeticException
- 如果发生数字溢出
-
-