模块  java.base
软件包  java.time.zone

Class ZoneRules

  • 实现的所有接口
    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 - 标准偏移的更改列表,不为null
        transitionList - 转换列表,不为null
        lastRules - 经常性的最后一条规则,大小为16或更小,不为空
        结果
        区域规则,不为空
      • of

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

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

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

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

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

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

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

        • 正常,有一个有效的偏移量。 对于一年中的绝大多数情况,正常情况适用,其中本地日期时间有一个有效的偏移量。
        • 差距,零有效偏移。 这是因为春天夏令时从“冬天”变为“夏天”,时钟向前跳跃。 在间隙中,存在没有有效偏移的本地日期时间值。
        • 重叠,有两个有效的偏移量。 这是因为秋季夏令时从“夏季”变为“冬季”,因此时钟被缩回。 在重叠中,存在具有两个有效偏移的本地日期时间值。
        因此,对于任何给定的本地日期时间,可以存在零个,一个或两个有效偏移。 此方法返回Normal情况下的单个偏移量,在Gap或Overlap情况下,它返回转换前的偏移量。

        因为,在Gap和Overlap的情况下,返回的偏移量是“最佳”值,而不是“正确”值,应该小心处理。 关心正确偏移的应用程序应使用此方法的组合, getValidOffsets(LocalDateTime)getTransition(LocalDateTime)

        参数
        localDateTime - 要查询的本地日期时间,而不是null,但如果规则对所有时刻都有一个偏移量,则可以忽略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);
          } 

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

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

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

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

        • 正常,有一个有效的偏移量。 对于一年中的绝大多数情况,正常情况适用,其中本地日期时间有一个有效的偏移量。
        • 差距,零有效偏移。 这是因为春天夏令时从“冬天”变为“夏天”,时钟向前跳跃。 在间隙中,存在没有有效偏移的本地日期时间值。
        • 重叠,有两个有效的偏移量。 这是因为秋季夏令时从“夏季”变为“冬季”,因此时钟被缩回。 在重叠中,存在具有两个有效偏移的本地日期时间值。
        转换用于模拟Gap或重叠的情况。 Normal情况将返回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
        结果
        偏移转换,如果本地日期时间不在转换中,则为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,但可以忽略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,并保存有关进入和退出夏令时的信息。 如果区域没有夏令时,或者有关未来更改的信息不确定,则列表将为空。

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

        结果
        转换规则的不可变列表,不为null
      • equals

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

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

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

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

        public String toString()
        返回描述此对象的字符串。
        重写:
        toString in class Object
        结果
        用于调试的字符串,而不是null