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

Class ZoneRules

  • All Implemented Interfaces:
    Serializable


    public final class ZoneRules
    extends Object
    implements Serializable
    定义区域偏移对于单个时区的变化的规则。

    规则模拟了时区的所有历史和未来转型。 ZoneOffsetTransition用于已知的转换,通常是历史记录。 ZoneOffsetTransitionRule用于基于算法结果的未来转换。

    规则通过ZoneRulesProvider使用ZoneId加载。 相同的规则可以在多个区域ID之间内部共享。

    序列化ZoneRules的实例将存储整套规则。 它不存储区域ID,因为它不是此对象的状态的一部分。

    规则实现可以存储或不存储关于历史和未来转换的完整信息,并且存储的信息与提供给规则提供者的实现一样准确。 应用程序应将提供的数据视为可用于执行此规则的最佳信息。

    实现要求:
    这个类是不可变的和线程安全的。
    从以下版本开始:
    1.8
    另请参见:
    Serialized Form
    • 方法详细信息

      • of

        public static ZoneRules of​(ZoneOffset baseStandardOffset,
                                   ZoneOffset baseWallOffset,
                                   List<ZoneOffsetTransition> standardOffsetTransitionList,
                                   List<ZoneOffsetTransition> transitionList,
                                   List<ZoneOffsetTransitionRule> lastRules)
        获取ZoneRules的实例。
        参数
        baseStandardOffset - 设置法定规则之前使用的标准偏移量,不为空
        baseWallOffset - 设置法定规则之前使用的墙偏移量,不为空
        standardOffsetTransitionList - 标准偏移量的更改列表,不为空
        transitionList - 转换列表,不为null
        lastRules - 重复的最后一个规则,大小16或更小,不为null
        结果
        区域规则,不为空
      • of

        public static ZoneRules of​(ZoneOffset offset)
        获取具有固定区域规则的ZoneRules实例。
        参数
        offset - 该固定区域规则所基于的偏移量,不为null
        结果
        区域规则,不为空
        另请参见:
        isFixedOffset()
      • isFixedOffset

        public boolean isFixedOffset​()
        检查区域规则是固定的,使得偏移量不变。
        结果
        如果时区是固定的并且偏移量永远不会改变,则为真
      • getOffset

        public ZoneOffset getOffset​(Instant instant)
        获得这些规则中指定时刻适用的偏移量。

        从瞬间到偏移的映射很简单,每个时刻只有一个有效的偏移量。 此方法返回该偏移量。

        参数
        instant - 找到偏移量的时间,不为null,但如果规则对于所有瞬间都有单个偏移量,则可以忽略null
        结果
        偏移量,不为空
      • getOffset

        public ZoneOffset getOffset​(LocalDateTime localDateTime)
        在这些规则中为指定的本地日期时间获取适当的偏移量。

        从本地日期时间到偏移量的映射并不简单。 有三种情况:

        • 正常,有一个有效的偏移。 在一年的绝大多数情况下,正常情况适用于当地日期时间单一有效抵消。
        • 间隙,零有效偏移。 这是由于春季夏令时从“冬季”变为“夏季”,时钟向前倾斜。 在间隙中,存在没有有效偏移量的本地日期时间值。
        • 重叠,有两个有效的偏移。 这是由于秋季夏令时间从“夏季”变为“冬季”而将时钟倒退。 在重叠中,存在具有两个有效偏移量的本地日期时间值。
        因此,对于任何给定的本地日期时间,可以有零个,一个或两个有效的偏移量。 该方法返回正常情况下的单个偏移量,并且在间隙或重叠情况下,它将返回转换之前的偏移量。

        由于在间隙和重叠的情况下,返回的偏移量是“最佳”值,而不是“正确”值,因此应小心对待。 关心正确偏移的应用程序应使用此方法getValidOffsets(LocalDateTime)getTransition(LocalDateTime)的组合。

        参数
        localDateTime - 查询的本地日期时间,不为空,但是如果规则对于所有瞬间都有单个偏移量,则可以忽略null
        结果
        当地日期时间的最佳可用偏移量,不为空
      • getValidOffsets

        public List<ZoneOffset> getValidOffsets​(LocalDateTime localDateTime)
        在这些规则中获取在指定的本地日期时间中适用的偏移量。

        从本地日期时间到偏移量的映射并不简单。 有三种情况:

        • 正常,有一个有效的偏移。 在一年的绝大多数情况下,正常情况适用于当地日期时间单一有效抵消。
        • 间隙,零有效偏移。 这是由于春季夏令时从“冬季”变为“夏季”,时钟向前倾斜。 在间隙中,存在没有有效偏移量的本地日期时间值。
        • 重叠,有两个有效的偏移。 这是由于秋季夏令时间从“夏季”变为“冬季”而将时钟倒退。 在重叠中,存在具有两个有效偏移量的本地日期时间值。
        因此,对于任何给定的本地日期时间,可以有零个,一个或两个有效的偏移量。 该方法返回有效偏移列表,它是大小为0,1或2的列表。在有两个偏移量的情况下,较早的偏移量在索引0处返回,后一个偏移量在索引1处返回。

        有多种方法来处理来自一个LocalDateTime的转换。 使用这种方法的一种技术是:

          List<ZoneOffset> validOffsets = rules.getOffset(localDT);
          if (validOffsets.size() == 1) {
            // Normal case: only one valid offset
            zoneOffset = validOffsets.get(0);
          } else {
            // Gap or Overlap: determine what to do from transition (which will be non-null)
            ZoneOffsetTransition trans = rules.getTransition(localDT);
          } 

        理论上说,有可能有两个以上的有效偏移量。 如果时钟要快速连续放回不止一次,会发生这种情况。 这在时区的历史上从来没有发生过,因此没有特别的处理。 但是,如果发生这种情况,列表将返回两个以上的条目。

        参数
        localDateTime - 查询有效偏移量的本地日期时间,不为null,但如果规则对于所有瞬间具有单个偏移量,则可以忽略null
        结果
        有效偏移的列表可能是不可变的,不为空
      • getTransition

        public ZoneOffsetTransition getTransition​(LocalDateTime localDateTime)
        在这些规则中获取在指定的本地日期时间中适用的偏移量转换。

        从本地日期时间到偏移量的映射并不简单。 有三种情况:

        • 正常,有一个有效的偏移。 在一年的绝大多数情况下,正常情况适用于当地日期时间单一有效抵消。
        • 间隙,零有效偏移。 这是由于春季夏令时从“冬季”变为“夏季”,时钟向前倾斜。 在间隙中,存在没有有效偏移量的本地日期时间值。
        • 重叠,有两个有效的偏移。 这是由于秋季夏令时间从“夏季”变为“冬季”而将时钟倒退。 在重叠中,存在具有两个有效偏移量的本地日期时间值。
        转换用于对间隙或重叠的情况进行建模。 正常情况将返回null。

        有多种方法来处理从LocalDateTime转换。 使用这种方法的一种技术是:

          ZoneOffsetTransition trans = rules.getTransition(localDT);
          if (trans != null) {
            // Gap or Overlap: determine what to do from transition
          } else {
            // Normal case: only one valid offset
            zoneOffset = rule.getOffset(localDT);
          } 
        参数
        localDateTime - 查询偏移转换的本地日期时间,不为空,但如果规则对于所有瞬间具有单个偏移量,则可以忽略null
        结果
        偏移转换,如果本地日期时间不在转换中则为null
      • getStandardOffset

        public ZoneOffset getStandardOffset​(Instant instant)
        获取此区域中指定时刻的标准偏移量。

        这提供了有关标准偏移量随时间变化的历史信息。 标准偏移量是在应用任何夏令时之前的偏移量。 这通常是冬季适用的偏移。

        参数
        instant - 如果规则对于所有瞬间都有单个偏移,则可以忽略找到偏移量信息的时间,而不是null,但是null可以被忽略
        结果
        标准偏移,不为空
      • getDaylightSavings

        public Duration getDaylightSavings​(Instant instant)
        获取此区域中指定时间使用的夏令时数量。

        这提供了有关夏令时数随时间变化的历史信息。 这是标准偏移和实际偏移之间的差异。 通常在冬天和夏天一个小时的数量是零。 时区是次要的,所以持续时间的纳秒部分将为零。

        此默认实现计算从actualstandard偏移量的持续时间。

        参数
        instant - 找到夏令时的时间,不为null,但是如果规则对于所有瞬间都有单个偏移量,则可以忽略null
        结果
        标准差和实际偏差之间的差异,不为零
      • isDaylightSavings

        public boolean isDaylightSavings​(Instant instant)
        检查指定的时间是否是夏令时。

        这将检查标准偏移量和实际偏移量对于指定时刻是否相同。 如果不是,则假设夏令时正在运行。

        此默认实现将比较actualstandard偏移量。

        参数
        instant - 找到偏移量信息的时间,不为空,但是如果规则对于所有瞬间都有单个偏移量,则可以忽略null
        结果
        标准偏移,不为空
      • isValidOffset

        public boolean isValidOffset​(LocalDateTime localDateTime,
                                     ZoneOffset offset)
        检查偏移日期时间对于这些规则是否有效。

        为了有效,本地日期时间不能在间隙中,偏移量必须与有效偏移之一匹配。

        此默认实现检查getValidOffsets(java.time.LocalDateTime)是否包含指定的偏移量。

        参数
        localDateTime - 检查的日期时间,不为null,但是如果规则对于所有瞬间具有单个偏移量,则可以忽略null
        offset - 要检查的偏移量,null返回false
        结果
        如果偏移日期时间对这些规则有效,则为true
      • nextTransition

        public ZoneOffsetTransition nextTransition​(Instant instant)
        在指定的时刻之后获取下一个转换。

        这将返回指定时间后的下一个转换的详细信息。 例如,如果瞬间表示“夏季”夏令时适用的点,则该方法将返回到下一个“冬季”时间的过渡。

        参数
        instant - 即时获取下一个转换,不为null,但是如果规则对于所有瞬间都有单个偏移量,则可以忽略null
        结果
        在指定的时间之后的下一个转换,如果这是在最后一个转换之后,则为null
      • previousTransition

        public ZoneOffsetTransition previousTransition​(Instant instant)
        获取指定时刻之前的转换。

        这将在指定时刻之前返回上一个转换的详细信息。 例如,如果瞬间表示“夏季”夏令时适用的点,则该方法将返回从上一个“冬季”时间过渡。

        参数
        instant - 如果规则对于所有时刻都有一个偏移量,则可以忽略之前的转换,而不是null,但是null可能会被忽略
        结果
        之前的转换在指定的时间之前,如果这是在第一次转换之前,则为null
      • getTransitions

        public List<ZoneOffsetTransition> getTransitions​()
        获取完全定义的转换的完整列表。

        该规则实例的完整转换集由此方法和getTransitionRules()定义。 此方法返回已完全定义的转换。 这些通常是历史的,但可能在将来。

        对于固定的偏移量规则以及只有一次偏移量的任何时区,列表将为空。 如果转换规则未知,则列表也将为空。

        结果
        完全定义的转换的不可变列表,不为null
      • getTransitionRules

        public List<ZoneOffsetTransitionRule> getTransitionRules​()
        获得过渡规则列表,超出转换列表中定义的年限。

        此规则实例的完整转换集由此方法和getTransitions()定义。 此方法返回ZoneOffsetTransitionRule实例,该实例定义了何时发生转换的算法。

        对于任何给定的ZoneRules ,该列表包含已经完全定义的那些年以后的转换规则。 这些规则通常是指未来的夏令时规则更改。

        如果该区域将来将定义夏令时,那么列表通常大小为2,并保存有关进入和退出夏令时的信息。 如果该区域没有夏令时,或有关未来更改的信息不确定,则列表将为空。

        对于固定的偏移规则和没有夏令时的任何时区,列表将为空。 如果转换规则未知,则列表也将为空。

        结果
        一个不可变的过渡规则列表,不为空
      • equals

        public boolean equals​(Object otherRules)
        检查这套规则是否等于另一个。

        如果任何给定的输入即时或本地日期时间总是导致相同的输出,两个规则集是相等的。 来自两个不同群组的规则可能会返回假,即使它们实际上相同。

        这个定义应该导致比较他们整个状态的实现。

        重写:
        equalsObject
        参数
        otherRules - 其他规则,null返回false
        结果
        如果此规则与指定的规则相同,则为true
        另请参见:
        Object.hashCode()HashMap
      • toString

        public String toString​()
        返回描述此对象的字符串。
        重写:
        toStringObject
        结果
        一个用于调试的字符串,不为null