- 所有已知的实现类:
ChronoField
日期和时间使用字段来表示,这些字段将时间线划分为对人类有意义的内容。此接口的实现代表这些字段。
最常用的单位在 ChronoField 中定义。 IsoFields 、WeekFields 和 JulianFields 中提供了更多字段。应用程序代码也可以通过实现此接口来编写字段。
该领域使用双重调度工作。客户端代码在日期时间调用方法,如 LocalDateTime 检查字段是否为 ChronoField 。如果是,则日期时间必须处理它。否则,方法调用将重新分派到此接口中的匹配方法。
- 实现要求:
-
必须小心实现此接口以确保其他类正确运行。所有可以实例化的实现都必须是最终的、不可变的和线程安全的。在可能的情况下,实现应该是
Serializable。枚举是有效的实现选择。 - 自从:
- 1.8
-
方法总结
修饰符和类型方法描述<R extends Temporal>
RadjustInto(R temporal, long newValue) 返回具有此字段集值的指定时间对象的副本。获取字段的测量单位。default StringgetDisplayName(Locale locale) 获取字段在请求的locale中的显示名称。longgetFrom(TemporalAccessor temporal) 从指定的时间对象中获取此字段的值。获取字段绑定的范围。boolean检查此字段是否表示日期的组成部分。booleanisSupportedBy(TemporalAccessor temporal) 检查时间对象是否支持此字段。boolean检查此字段是否表示时间的组成部分。range()获取字段的有效值范围。rangeRefinedBy(TemporalAccessor temporal) 使用时间对象获取此字段的有效值范围以优化结果。default TemporalAccessorresolve(Map<TemporalField, Long> fieldValues, TemporalAccessor partialTemporal, ResolverStyle resolverStyle) 解决此字段以提供更简单的替代或日期。toString()获取字段的描述性名称。
-
方法详情
-
getDisplayName
获取字段在请求的locale中的显示名称。如果locale没有显示名称,则必须返回合适的默认值。
默认实现必须检查locale不为空并返回
toString()。- 参数:
locale- 要使用的locale,不为空- 返回:
- locale的显示名称或合适的默认值,不为空
-
getBaseUnit
TemporalUnit getBaseUnit()获取字段的测量单位。该字段的单位是在范围内变化的周期。例如,在“MonthOfYear”字段中,单位为“月”。另请参阅
getRangeUnit()。- 返回:
- 定义字段基本单位的单位,不为空
-
getRangeUnit
TemporalUnit getRangeUnit()获取字段绑定的范围。场的范围是场变化的周期。例如,在“MonthOfYear”字段中,范围是“Years”。另见
getBaseUnit()。范围从不为空。例如,“Year”字段是“YearOfForever”的简写。因此,它的单位是“年”,范围是“永远”。
- 返回:
- 定义字段范围的单位,不为空
-
range
ValueRange range()获取字段的有效值范围。所有字段都可以表示为一个
long整数。此方法返回一个描述该值有效范围的对象。这种方法一般只适用于ISO-8601日历系统。请注意,结果仅描述了最小和最大有效值,重要的是不要过多地解读它们。例如,范围内可能存在对该字段无效的值。
- 返回:
- 该字段的有效值范围,不为空
-
isDateBased
boolean isDateBased()检查此字段是否表示日期的组成部分。如果字段可以从
EPOCH_DAY派生,则它是基于日期的。请注意,isDateBased()和isTimeBased()返回 false 都是有效的,例如在表示像星期几这样的字段时。- 返回:
- 如果此字段是日期的组成部分,则为真
-
isTimeBased
boolean isTimeBased()检查此字段是否表示时间的组成部分。如果字段可以从
NANO_OF_DAY派生,则它是基于时间的。请注意,isDateBased()和isTimeBased()返回 false 都是有效的,例如在表示像星期几这样的字段时。- 返回:
- 如果此字段是时间的组成部分,则为真
-
isSupportedBy
检查时间对象是否支持此字段。这确定时间访问器是否支持此字段。如果返回 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- 要查询的时间对象,不为空- 返回:
- 如果可以查询此字段的日期时间,则为 true,否则为 false
-
rangeRefinedBy
使用时间对象获取此字段的有效值范围以优化结果。这使用时间对象来查找字段的有效值范围。这类似于
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- 用于优化结果的时间对象,不为空- 返回:
- 该字段的有效值范围,不为空
- 抛出:
DateTimeException- 如果无法获得该字段的范围UnsupportedTemporalTypeException- 如果时间不支持该字段
-
getFrom
从指定的时间对象中获取此字段的值。这将查询时间对象以获取此字段的值。
有两种等效的方法可以使用此方法。第一种是直接调用此方法。第二种是使用
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- 如果发生数字溢出
-
adjustInto
返回具有此字段集值的指定时间对象的副本。这将返回一个基于指定对象的新时间对象,该对象的值已更改。例如,在
LocalDate上,这可用于设置年、月或月中的某天。返回的对象与指定对象具有相同的可观察类型。在某些情况下,更改字段未完全定义。例如,如果目标对象是表示 1 月 31 日的日期,那么将月份更改为 2 月将不清楚。在这种情况下,实现负责解决结果。通常它会选择之前的有效日期,在本例中为 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 对象的类型- 参数:
temporal- 要调整的时间对象,不为空newValue- 字段的新值- 返回:
- 调整后的时间对象,不为空
- 抛出:
DateTimeException- 如果无法设置该字段UnsupportedTemporalTypeException- 如果时间不支持该字段ArithmeticException- 如果发生数字溢出
-
resolve
default TemporalAccessor resolve(Map <TemporalField , Long > fieldValues, TemporalAccessor partialTemporal, ResolverStyle resolverStyle) 解决此字段以提供更简单的替代或日期。在解析的解析阶段调用此方法。它旨在允许将应用程序定义的字段简化为更标准的字段,例如
ChronoField上的字段,或简化为日期。应用程序通常不应直接调用此方法。
- 实现要求:
-
如果实现表示可以简化或与其他字段组合的字段,则必须实现此方法。
指定的map包含解析的当前状态。该map是可变的,必须进行变异才能解析该字段和任何相关字段。如果map包含此字段,则只会在解析期间调用此方法,因此实现应假定此字段存在。
解析一个字段将包括查看该字段的值,以及可能的其他字段,并使用更简单的值(例如
ChronoField)更新映射,或者返回一个完整的ChronoLocalDate。如果解析成功,代码必须从map中删除所有已解析的字段,包括该字段。例如,
IsoFields类包含季度和季度字段。该方法在该类中的实现将两个字段加上YEAR解析为一个完整的LocalDate。 resolve 方法将在返回LocalDate之前从map中删除所有三个字段。部分完整的时间用于允许查询年表和区域。一般来说,只需要年表。查询 zone 或 chronology 以外的项目是未定义的,不能依赖。
get、getLong、range和isSupported等其他方法的行为是不可预测的,结果未定义。如果解析应该是可能的,但数据无效,则解析器样式应该用于确定适当的宽大程度,这可能需要抛出
DateTimeException或ArithmeticException。如果无法解决,则 resolve 方法必须返回 null。解析时间字段时,map将被更改并返回 null。解析日期字段时,通常会从方法返回日期,并更改map以删除已解析的字段。但是,将日期字段解析为可以生成日期的其他
ChronoField实例(例如EPOCH_DAY)也是可以接受的。并非所有
TemporalAccessor实现都被接受为返回值。调用此方法的实现必须接受ChronoLocalDate、ChronoLocalDateTime、ChronoZonedDateTime和LocalTime。默认实现必须返回 null。
- 参数:
fieldValues- 字段到值的映射,可以更新,不为空partialTemporal- 查询区域和年表的部分完整时间;查询其他事物未定义且不推荐,不为空resolverStyle- 请求的解析类型,不为空- 返回:
- 解析的时间对象;如果解析仅更改了map,或者没有解析发生,则为 null
- 抛出:
ArithmeticException- 如果发生数字溢出DateTimeException- 如果解析结果出错。不得在未先检查是否支持的情况下通过查询时间字段来抛出此错误
-
toString
String toString()获取字段的描述性名称。应该采用“BaseOfRange”格式,例如“MonthOfYear”,除非该字段的范围为
FOREVER,此时仅提及基本单位,例如“年”或“纪元”。
-