Module  java.base
软件包  java.time.temporal

Interface TemporalField

  • 所有已知实现类:
    ChronoField


    public interface TemporalField
    日期时间的字段,如月份或小时。

    日期和时间使用将时间线划分成对人有意义的东西的字段来表示。 此接口的实现表示这些字段。

    最常用的单位在ChronoField中定义。 此外字段在供给IsoFieldsWeekFieldsJulianFields 字段也可以通过实现该接口的应用程序代码编写。

    该领域使用双重调度工作。 客户端代码调用日期时间的方法,如LocalDateTime ,检查该字段是否为ChronoField 如果是,则日期时间必须处理它。 否则,方法调用将重新分配到此接口中的匹配方法。

    实现要求:
    该接口必须小心实施,以确保其他类正确运行。 可以实例化的所有实现必须是最终的,不可变的和线程安全的。 如果可能的话应该是Serializable 枚举是有效的实施选择。
    从以下版本开始:
    1.8
    • 方法详细信息

      • getDisplayName

        default String getDisplayName​(Locale locale)
        获取所请求语言环境中字段的显示名称。

        如果区域设置没有显示名称,则必须返回合适的默认值。

        默认实现必须检查区域设置不为null并返回toString()

        参数
        locale - 要使用的语言环境,不为空
        结果
        区域设置的显示名称或合适的默认值,不为空
      • getBaseUnit

        TemporalUnit getBaseUnit​()
        获取测量场的单位。

        字段的单位是在该范围内变化的周期。 例如,在“MonthOfYear”字段中,单位为“Months”。 参见getRangeUnit()

        结果
        定义字段的基本单位的单位不为空
      • getRangeUnit

        TemporalUnit getRangeUnit​()
        获取字段绑定的范围。

        字段的范围是字段在内部变化的周期。 例如,在“MonthOfYear”字段中,范围是“年”。 参见getBaseUnit()

        范围从不为空。 例如,'Year'字段是'YearOfForever'的缩写。 因此,它具有“年”和“永远”的单位。

        结果
        定义字段范围的单位,不为空
      • range

        ValueRange range​()
        获取字段的有效值的范围。

        所有字段可以表示为long整数。 此方法返回描述该值的有效范围的对象。 该方法一般仅适用于ISO-8601日历系统。

        请注意,结果仅描述最小和最大有效值,重要的是不要太多读取它们。 例如,可以在该范围内的值对该字段无效。

        结果
        字段的有效值的范围不为null
      • isDateBased

        boolean isDateBased​()
        检查此字段是否表示日期的组件。

        一个字段是基于日期的,如果它可以从EPOCH_DAY派生。 请注意,对于isDateBased()isTimeBased()可以返回false,例如,当表示像星期几这样的字段时。

        结果
        如果此字段是日期的组成部分,则为true
      • isTimeBased

        boolean isTimeBased​()
        检查此字段是否表示时间的一个组成部分。

        一个字段是基于时间的,如果它可以从NANO_OF_DAY派生。 请注意,对于isDateBased()isTimeBased()可以返回false,例如表示像星期几这样的字段时。

        结果
        如果此字段是时间的一个组成部分,则为true
      • isSupportedBy

        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 - 要查询的时间对象,不为空
        结果
        如果可以查询此字段的日期时间,则为true,否则为false
      • rangeRefinedBy

        ValueRange rangeRefinedBy​(TemporalAccessor temporal)
        使用时间对象获取此字段的有效值的范围以优化结果。

        这使用时间对象来查找该字段的有效值的范围。 这类似于range() ,但是这种方法使用时间来优化结果。 例如,如果字段是DAY_OF_MONTHrange方法不准确,因为有四个可能的月份长度, range和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
        结果
        该字段的有效值的范围不为null
        异常
        DateTimeException - 如果无法获取字段的范围
        UnsupportedTemporalTypeException - 如果字段不受时间支持
      • getFrom

        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 - 要查询的时间对象,不为空
        结果
        该字段的值不为null
        异常
        DateTimeException - 如果无法获取字段的值
        UnsupportedTemporalTypeException - 如果字段不受时间支持
        ArithmeticException - 如果发生数字溢出
      • adjustInto

        <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 - 如果发生数字溢出
      • resolve

        default TemporalAccessor resolve​(Map<TemporalField,Long> fieldValues,
                                         TemporalAccessor partialTemporal,
                                         ResolverStyle resolverStyle)
        解决此字段以提供更简单的替代或日期。

        在解析的解析阶段调用此方法。 它旨在允许将应用程序定义的字段简化为更标准的字段,例如ChronoField或更多的日期。

        应用程序通常不应直接调用此方法。

        实现要求:
        如果一个实现表示一个可以被简化或与其他组合的字段,则必须实现该方法。

        指定的映射包含解析的当前状态。 该地图是可变的,必须进行突变才能解析字段和任何相关字段。 如果地图包含此字段,则此方法仅在解析期间被调用,因此实现应该假定该字段存在。

        解析字段将包括查看此字段的值,以及潜在的其他字段,并使用更简单的值(例如ChronoField更新映射,或返回完整的ChronoLocalDate 如果解决方案成功,代码必须从地图中删除已解决的所有字段,包括此字段。

        例如, IsoFields类包含四分之一和四分之一的字段。 该方法在该类中的实现将两个字段加上YEAR成为一个完整的LocalDate 解决方法将在返回LocalDate之前从地图中删除所有三个字段。

        使用部分完整的时间来允许查询年表和区域。 一般来说,只需要年表。 查询除区域或年表之外的项目未定义,不得依赖。 的其他方法,如行为getgetLongrangeisSupported是不可预测的,结果不确定。

        如果解决方案是可行的,但数据无效,则应使用解析器样式来确定适当的宽大级别,这可能需要抛出DateTimeExceptionArithmeticException 如果无法解析,则resolve方法必须返回null。

        当解析时间字段时,映射将被更改并返回null。 当解析日期字段时,通常从方法返回日期,并更改映射以删除已解析的字段。 但是,将日期字段解析成可以生成日期的其他ChronoField实例也是可以接受的,例如EPOCH_DAY

        并非所有TemporalAccessor实现都被接受为返回值。 调用此方法的实现必须接受ChronoLocalDateChronoLocalDateTimeChronoZonedDateTimeLocalTime

        默认实现必须返回null。

        参数
        fieldValues - 可以更新的字段映射到值,不为null
        partialTemporal - 部分完整的时间来查询区域和年表; 查询其他事项是未定义的,不推荐,不为null
        resolverStyle - 请求的解析类型,不为null
        结果
        解决的时间对象; null如果解析只改变了地图,或者没有解决
        异常
        ArithmeticException - 如果发生数字溢出
        DateTimeException - 如果解决导致错误。 在不首先检查是否支持的情况下,通过查询时间上的字段不能抛出此异常
      • toString

        String toString​()
        获取字段的描述性名称。

        应为“BaseOfRange”格式,如“MonthOfYear”,除非该字段的范围为FOREVER ,当仅提及基本单元时,例如“年”或“时代”。

        重写:
        toStringObject
        结果
        字段的名称,不为null