public interface TemporalField
日期和时间使用将时间线划分成对人有意义的东西的字段来表示。 此接口的实现表示这些字段。
最常用的单位在ChronoField
中定义。 此外字段在供给IsoFields
, WeekFields
和JulianFields
。 字段也可以通过实现该接口的应用程序代码编写。
该领域使用双重调度工作。 客户端代码调用日期时间的方法,如LocalDateTime
,它检查该字段是否为ChronoField
。 如果是,则日期时间必须处理它。 否则,方法调用将重新分配到此接口中的匹配方法。
Serializable
。
枚举是有效的实施选择。
Modifier and Type | Method and Description |
---|---|
<R extends Temporal> |
adjustInto(R temporal, long newValue)
返回指定时间对象的副本,并设置该字段的值。
|
TemporalUnit |
getBaseUnit()
获取测量场的单位。
|
default String |
getDisplayName(Locale locale)
获取所请求语言环境中字段的显示名称。
|
long |
getFrom(TemporalAccessor temporal)
从指定的时间对象获取此字段的值。
|
TemporalUnit |
getRangeUnit()
获取字段绑定的范围。
|
boolean |
isDateBased()
检查此字段是否表示日期的组件。
|
boolean |
isSupportedBy(TemporalAccessor temporal)
检查时间对象是否支持该字段。
|
boolean |
isTimeBased()
检查此字段是否表示时间的一个组成部分。
|
ValueRange |
range()
获取字段的有效值的范围。
|
ValueRange |
rangeRefinedBy(TemporalAccessor temporal)
使用时间对象获取此字段的有效值的范围以优化结果。
|
default TemporalAccessor |
resolve(Map<TemporalField,Long> fieldValues, TemporalAccessor partialTemporal, ResolverStyle resolverStyle)
解决此字段以提供更简单的替代或日期。
|
String |
toString()
获取字段的描述性名称。
|
default String getDisplayName(Locale locale)
如果区域设置没有显示名称,则必须返回合适的默认值。
默认实现必须检查区域设置不为null并返回toString()
。
locale
- 要使用的区域设置,不为空
TemporalUnit getBaseUnit()
字段的单位是在该范围内变化的周期。 例如,在“MonthOfYear”字段中,单位为“Months”。 另见getRangeUnit()
。
TemporalUnit getRangeUnit()
字段的范围是字段在内部变化的周期。 例如,在“MonthOfYear”字段中,范围是“年”。 参见getBaseUnit()
。
范围从不为空。 例如,'Year'字段是'YearOfForever'的缩写。 因此,它具有“年”和“永远”的单位。
ValueRange range()
所有字段都可以表示为long
整数。 此方法返回描述该值的有效范围的对象。 该方法一般仅适用于ISO-8601日历系统。
请注意,结果仅描述最小和最大有效值,重要的是不要太多读取它们。 例如,可以在该范围内的值对该字段无效。
boolean isDateBased()
一个字段是基于日期的,如果它可以从EPOCH_DAY
派生 。 请注意,它们对于isDateBased()
和isTimeBased()
都有效返回false,例如当表示星期几的字段时。
boolean isTimeBased()
一个字段是基于时间的,如果它可以从NANO_OF_DAY
派生 。 请注意,对于isDateBased()
和isTimeBased()
可以返回false,例如当表示像星期几的字段时。
boolean isSupportedBy(TemporalAccessor temporal)
这决定了临时访问者是否支持该字段。 如果这返回false,则不能查询该字段的时间。
使用这种方法有两种等效的方法。 第一个是直接调用这个方法。 二是使用TemporalAccessor.isSupported(TemporalField)
:
// these two lines are equivalent, but the second approach is recommended
temporal = thisField.isSupportedBy(temporal);
temporal = temporal.isSupported(thisField);
建议使用第二种方法, isSupported(TemporalField)
,因为在代码中阅读更清楚。
实现应该确定他们使用可用的字段是否支持ChronoField
。
temporal
- 要查询的时间对象,不为null
ValueRange rangeRefinedBy(TemporalAccessor temporal)
这使用时间对象来查找该字段的有效值的范围。 这类似于range()
,但是这种方法使用时间来优化结果。 例如,如果字段为DAY_OF_MONTH
那么range
方法是不准确的,因为有四个可能的月份长度,28,29,30和31天。 使用此方法与日期允许范围准确,只返回这四个选项之一。
使用这种方法有两种等效的方法。 第一个是直接调用这个方法。 二是使用TemporalAccessor.range(TemporalField)
:
// these two lines are equivalent, but the second approach is recommended
temporal = thisField.rangeRefinedBy(temporal);
temporal = temporal.range(thisField);
建议使用第二种方法, range(TemporalField)
,因为在代码中阅读更清楚。
实施应使用ChronoField
中可用的字段执行任何查询或计算 。 如果不支持该字段,则必须抛出一个UnsupportedTemporalTypeException
。
temporal
- 用于细化结果的时间对象,不为null
DateTimeException
- 如果无法获取字段的范围
UnsupportedTemporalTypeException
- 如果字段不受时间支持
long getFrom(TemporalAccessor temporal)
这将查询该时间对象的该字段的值。
使用这种方法有两种等效的方法。 第一个是直接调用这个方法。 二是使用TemporalAccessor.getLong(TemporalField)
(或TemporalAccessor.get(TemporalField)
):
// these two lines are equivalent, but the second approach is recommended
temporal = thisField.getFrom(temporal);
temporal = temporal.getLong(thisField);
建议使用第二种方法, getLong(TemporalField)
,因为在代码中阅读更清楚。
实施应使用ChronoField
中可用的字段执行任何查询或计算 。 如果不支持该字段,则必须抛出一个UnsupportedTemporalTypeException
。
temporal
- 要查询的时间对象,不为空
DateTimeException
- 如果无法获取该字段的值
UnsupportedTemporalTypeException
- 如果字段不受时间支持
ArithmeticException
- 如果发生数字溢出
<R extends Temporal> R adjustInto(R temporal, long newValue)
这将返回一个新的时间对象,该对象基于指定的时间对象,该字段的值已更改。 例如,在LocalDate
,这可以用于设置年,月或月的日期。 返回的对象具有与指定对象相同的可观察类型。
在某些情况下,更改字段尚未完全定义。 例如,如果目标对象是代表1月31日的日期,则将月份更改为2月份将不清楚。 在这种情况下,实施负责解决结果。 通常,它将选择先前的有效日期,这将是本例中最后一个有效的二月份。
使用这种方法有两种等效的方法。 第一个是直接调用这个方法。 二是使用Temporal.with(TemporalField, long)
:
// these two lines are equivalent, but the second approach is recommended
temporal = thisField.adjustInto(temporal);
temporal = temporal.with(thisField);
建议使用第二种方法, with(TemporalField)
,因为在代码中阅读更清楚。
实施应使用ChronoField
中可用的字段执行任何查询或计算 。 如果不支持该字段,则必须抛出一个UnsupportedTemporalTypeException
。
实现不能改变指定的时间对象。 相反,必须退还原件的调整副本。 这为不可变和可变的实现提供了相当的安全行为。
R
- 时间对象的类型
temporal
- 要调整的时间对象,不为空
newValue
- 该字段的新值
DateTimeException
- 如果字段无法设置
UnsupportedTemporalTypeException
- 如果字段不受时间支持
ArithmeticException
- 如果发生数字溢出
default TemporalAccessor resolve(Map<TemporalField,Long> fieldValues, TemporalAccessor partialTemporal, ResolverStyle resolverStyle)
在解析的解析阶段调用此方法。 它被设计为允许将应用程序定义的字段简化为更标准的字段,例如ChronoField
或更多的日期。
应用程序通常不应直接调用此方法。
指定的映射包含解析的当前状态。 该地图是可变的,必须进行突变才能解析字段和任何相关字段。 如果地图包含此字段,则此方法仅在解析期间被调用,因此实现应该假定该字段存在。
解析字段将包括查看此字段的值,以及潜在的其他字段,并用更简单的值更新映射,例如ChronoField
或返回完整的ChronoLocalDate
。 如果解决方案成功,代码必须从地图中删除已解决的所有字段,包括此字段。
例如, IsoFields
类包含四分之一和四分之一的字段。 该方法在该类中的实现将两个字段加上YEAR
,形成一个完整的LocalDate
。 解决方法将在返回LocalDate
之前从地图中删除所有三个字段。
使用部分完整的时间来允许查询年表和区域。 一般来说,只需要按时间顺序。 查询除区域或年表之外的项目未定义,不得依赖。 的其他方法,如行为get
, getLong
, range
和isSupported
是不可预测的,结果不确定。
如果解决方案是可行的,但数据无效,应使用解析器风格来确定适当的宽大程度,这可能需要抛出DateTimeException
或ArithmeticException
。 如果无法解析,则resolve方法必须返回null。
当解析时间字段时,映射将被更改并返回null。 当解析日期字段时,通常从方法返回日期,并更改映射以删除已解析的字段。 但是,将日期字段解析成可以生成日期的其他ChronoField
实例也是可以接受的,例如EPOCH_DAY
。
不是所有TemporalAccessor
实现都被接受为返回值。 调用此方法的实现必须接受ChronoLocalDate
, ChronoLocalDateTime
, ChronoZonedDateTime
和LocalTime
。
默认实现必须返回null。
fieldValues
- 可以更新的字段映射到值,不为null
partialTemporal
- 区域和年表的部分完整时间查询;
查询其他事项是未定义的,不推荐,不为null
resolverStyle
- 所请求的解析类型,不为null
ArithmeticException
- 如果发生数字溢出
DateTimeException
- 如果解决导致错误。
在不首先检查是否支持的情况下,通过查询时间上的字段不能抛出此异常