Module java.base
Package java.time.zone

Class ZoneRules

java.lang.Object
java.time.zone.ZoneRules
所有已实现的接口:
Serializable

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

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

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

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

规则实现可能会或可能不会存储有关历史和未来转换的完整信息,存储的信息仅与规则提供程序向实现提供的信息一样准确。应用程序应将提供的数据视为此规则实现的最佳信息。

实现要求:
此类是不可变的且线程安全的。
自 JDK 1.8 起:
1.8
另请参阅:
  • Method Details

    • of

      public static ZoneRules of(ZoneOffset baseStandardOffset, ZoneOffset baseWallOffset, List<ZoneOffsetTransition> standardOffsetTransitionList, List<ZoneOffsetTransition> transitionList, List<ZoneOffsetTransitionRule> lastRules)
      获取ZoneRules的实例。
      参数:
      baseStandardOffset - 在设置法律规则之前使用的标准偏移量,不能为空
      baseWallOffset - 在设置法律规则之前使用的墙壁偏移量,不能为空
      standardOffsetTransitionList - 标准偏移量更改列表,不能为空
      transitionList - 转换列表,不能为空
      lastRules - 重复的最后规则,大小不超过16,不能为空
      返回:
      时区规则,不能为空
    • of

      public static ZoneRules of(ZoneOffset offset)
      获取具有固定时区规则的ZoneRules实例。
      参数:
      offset - 此固定时区规则基于的偏移量,不能为空
      返回:
      时区规则,不能为空
      另请参阅:
    • isFixedOffset

      public boolean isFixedOffset()
      检查时区规则是否固定,即偏移量永远不会变化。
      返回:
      如果时区是固定的且偏移量永远不会变化,则为true
    • getOffset

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

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

      参数:
      instant - 要查找偏移量的时刻,不能为空,但如果规则对所有时刻具有单个偏移量,则可以忽略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.getValidOffsets(localDT);
        if (validOffsets.size() == 1) {
          // 正常情况:只有一个有效的偏移量
          zoneOffset = validOffsets.get(0);
        } else {
          // 间隙或重叠:从转换中确定要执行的操作(将不为null)
          ZoneOffsetTransition trans = rules.getTransition(localDT);
        }
       

      理论上,可能存在超过两个有效偏移量。如果时钟需要快速连续地后退多次,这将发生。这在时区历史中从未发生过,因此没有特殊处理。但是,如果发生这种情况,列表将返回超过2个条目。

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

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

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

      • 正常,有一个有效的偏移量。在大多数时间里,正常情况适用,即本地日期时间有一个有效的偏移量。
      • 间隙,没有有效的偏移量。这是时钟向前跳跃的情况,通常是由于从“冬季”到“夏季”的春季夏令时变化。在间隙中,存在没有有效偏移量的本地日期时间值。
      • 重叠,有两个有效的偏移量。这是时钟向后设置的情况,通常是由于从“夏季”到“冬季”的秋季夏令时变化。在重叠中,存在两个有效偏移量的本地日期时间值。
      使用转换来模拟间隙或重叠的情况。正常情况将返回null。

      有各种方法可以处理从LocalDateTime的转换。使用此方法的一种技术可能是:

        ZoneOffsetTransition trans = rules.getTransition(localDT);
        if (trans != null) {
          // 间隙或重叠:从转换中确定要执行的操作
        } else {
          // 正常情况:只有一个有效的偏移量
          zoneOffset = rule.getOffset(localDT);
        }
       
      参数:
      localDateTime - 要查询偏移转换的本地日期时间,不能为空,但如果规则对所有时刻具有单个偏移量,则可以忽略null
      返回:
      偏移转换,如果本地日期时间不在转换中则为null
    • getStandardOffset

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

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

      参数:
      instant - 要查找偏移信息的时刻,不能为空,但如果规则对所有时刻具有单个偏移量,则可以忽略null
      返回:
      标准偏移量,不能为空
    • getDaylightSavings

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

      这提供了关于夏令时量如何随时间变化的历史信息。这是标准偏移和实际偏移之间的差异。通常在冬季为零,在夏季为一小时。时区是基于秒的,因此持续时间的纳秒部分将为零。

      此默认实现从实际标准偏移计算持续时间。

      参数:
      instant - 要查找夏令时的时刻,不能为空,但如果规则对所有时刻具有单个偏移量,则可以忽略空值
      返回:
      标准偏移和实际偏移之间的差异,不能为空
    • isDaylightSavings

      public boolean isDaylightSavings(Instant instant)
      检查指定时刻是否处于夏令时。

      这会检查指定时刻的标准偏移和实际偏移是否相同。如果它们不同,则假定正在执行夏令时。

      此默认实现比较实际标准偏移。

      参数:
      instant - 要查找偏移信息的时刻,不能为空,但如果规则对所有时刻具有单个偏移量,则可以忽略空值
      返回:
      标准偏移,不能为空
    • isValidOffset

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

      要有效,本地日期时间不能处于间隙中,偏移必须与有效偏移之一匹配。

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

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

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

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

      参数:
      instant - 要获取下一个转换的时刻,不能为空,但如果规则对所有时刻具有单个偏移量,则可以忽略空值
      返回:
      指定时刻之后的下一个转换,如果这在最后一个转换之后则为null
    • previousTransition

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

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

      参数:
      instant - 要获取上一个转换的时刻,不能为空,但如果规则对所有时刻具有单个偏移量,则可以忽略空值
      返回:
      指定时刻之前的上一个转换,如果这在第一个转换之前则为null
    • getTransitions

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

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

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

      返回:
      完全定义的转换的不可变列表,不能为空
    • getTransitionRules

      public List<ZoneOffsetTransitionRule> getTransitionRules()
      获取超出转换列表中定义的年份的转换规则列表。

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

      对于给定的ZoneRules,此列表包含超出已完全定义年份的转换规则。这些规则通常指未来夏令时规则更改。

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

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

      返回:
      转换规则的不可变列表,不能为空
    • equals

      public boolean equals(Object otherRules)
      检查此规则集是否等于另一个规则集。

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

      此定义应导致实现比较其整个状态。

      覆盖:
      equals 在类 Object
      参数:
      otherRules - 另一个规则,空值返回false
      返回:
      如果此规则与指定规则相同,则为true
      参见:
    • hashCode

      public int hashCode()
      给定#equals的定义,返回适当的哈希码。
      覆盖:
      hashCode 在类 Object
      返回:
      哈希码
      参见:
    • toString

      public String toString()
      返回描述此对象的字符串。
      覆盖:
      toString 在类 Object
      返回:
      用于调试的字符串,不能为空