Module java.base
Package java.time.zone

Class ZoneRulesProvider

java.lang.Object
java.time.zone.ZoneRulesProvider

public abstract class ZoneRulesProvider extends Object
提供系统的时区规则。

此类管理时区规则的配置。静态方法提供可用于管理提供程序的公共API。抽象方法提供了允许提供规则的SPI。

ZoneRulesProvider可以作为扩展类安装在Java平台的实例中,即放置在任何常规扩展目录中的jar文件。安装的提供程序使用由ServiceLoader类定义的服务提供程序加载设施进行加载。ZoneRulesProvider通过在资源目录META-INF/services中命名为java.time.zone.ZoneRulesProvider的提供程序配置文件来标识自身。该文件应包含一行,指定完全限定的具体zonerules-provider类名。提供程序也可以通过将它们添加到类路径或通过通过registerProvider(java.time.zone.ZoneRulesProvider)方法注册自己来提供。

Java虚拟机具有一个默认提供程序,为IANA时区数据库(TZDB)定义的时区提供规则。如果定义了系统属性java.time.zone.DefaultZoneRulesProvider,则将其视为要加载为默认提供程序的具体ZoneRulesProvider类的完全限定名称,使用系统类加载器。如果未定义此系统属性,则将加载系统默认提供程序以充当默认提供程序。

规则主要通过区域ID查找,如ZoneId使用的那样。这里不使用区偏移ID。

时区规则是政治性的,因此数据可能随时更改。每个提供程序将为每个区域ID提供最新的规则,但它们也可能提供规则如何更改的历史记录。

实现要求:
此接口是一个可以被多个线程调用的服务提供程序。实现必须是不可变的和线程安全的。

提供程序必须确保一旦应用程序看到规则,规则必须继续可用。

鼓励提供程序实现一个有意义的toString方法。

许多系统希望动态更新时区规则而不停止JVM。细节上来看,这是一个复杂的问题。提供程序可以选择处理动态更新,但默认提供程序不会。

自版本:
1.8
  • Constructor Details

    • ZoneRulesProvider

      protected ZoneRulesProvider()
      构造函数。
  • Method Details

    • getAvailableZoneIds

      public static Set<String> getAvailableZoneIds()
      获取可用区域ID的集合。

      这些ID是ZoneId的字符串形式。

      返回:
      不可修改的区域ID集合,不为null
    • getRules

      public static ZoneRules getRules(String zoneId, boolean forCaching)
      获取区域ID的规则。

      这返回区域ID的最新可用规则。

      此方法依赖于已配置的时区数据提供程序文件。这些文件使用ServiceLoader加载。

      缓存标志旨在允许提供程序实现阻止规则在ZoneId中被缓存。在正常情况下,缓存区域规则是非常可取的,因为它将提供更好的性能。但是,存在一种情况,其中缓存是不可取的,请参阅provideRules(java.lang.String, boolean)

      参数:
      zoneId - 由ZoneId定义的区域ID,不为null
      forCaching - 是否查询缓存的规则,如果返回的规则将被ZoneId缓存,则为true,如果它们将被返回给用户而不被ZoneId缓存,则为false
      返回:
      规则,如果forCaching为true且这是一个希望阻止在ZoneId中缓存的动态提供程序,则为null,否则不为null
      抛出:
      ZoneRulesException - 如果无法获取区域ID的规则
    • getVersions

      public static NavigableMap<String,ZoneRules> getVersions(String zoneId)
      获取区域ID的规则历史。

      时区由政府定义并经常更改。此方法允许应用程序查找单个区域ID的规则更改历史。该映射以与规则相关联的版本字符串为键。

      版本的确切含义和格式是特定于提供程序的。版本必须遵循词典顺序,因此返回的映射将按照已知规则的最旧到最新可用规则的顺序排序。默认的'TZDB'组使用由年份后跟字母组成的版本编号,例如'2009e'或'2012f'。

      实现必须为每个有效的区域ID提供结果,但它们不必提供规则历史。因此,映射将始终包含一个元素,并且仅在可用历史规则信息时才会包含多个元素。

      参数:
      zoneId - 由ZoneId定义的区域ID,不为null
      返回:
      区域ID的规则历史的可修改副本,从最旧到最新排序,不为null
      抛出:
      ZoneRulesException - 如果无法获取区域ID的历史
    • registerProvider

      public static void registerProvider(ZoneRulesProvider provider)
      注册区域规则提供程序。

      这将添加一个新的提供程序到当前可用的提供程序中。提供程序为一个或多个区域ID提供规则。如果提供程序提供已经注册的区域ID,则无法注册提供程序。请参阅关于在ZoneId中使用时区ID概念的注意事项,特别是关于使用“组”概念使ID唯一的部分。

      为了确保已创建的时区的完整性,没有办法取消注册提供程序。

      参数:
      provider - 要注册的提供程序,不为null
      抛出:
      ZoneRulesException - 如果区域ID已经注册
    • refresh

      public static boolean refresh()
      从底层数据提供程序刷新规则。

      此方法允许应用程序请求提供程序检查所提供规则的任何更新。调用此方法后,任何ZonedDateTime中存储的偏移量可能对区域ID无效。

      规则的动态更新是一个复杂的问题,大多数应用程序不应使用此方法或动态规则。要实现动态规则,必须按照此类的规范编写提供程序实现。此外,ZoneRules的实例不得在应用程序中缓存,因为它们将变得过时。但是,provideRules(String, boolean)上的布尔标志允许提供程序实现控制ZoneId的缓存,可能确保系统中的所有对象看到新规则。请注意,动态规则提供程序的性能成本可能较高。还要注意,此规范中没有动态规则提供程序。

      返回:
      如果规则已更新,则为true
      抛出:
      ZoneRulesException - 如果刷新期间发生错误
    • provideZoneIds

      protected abstract Set<String> provideZoneIds()
      获取可用区域ID的SPI方法。

      这获取此ZoneRulesProvider提供的ID。提供程序应至少为一个区域ID提供数据。

      返回的区域ID在应用程序的生命周期内仍然可用和有效。动态提供程序可以随着更多数据的可用而增加ID集。

      返回:
      提供的区域ID集,不为null
      抛出:
      ZoneRulesException - 如果提供ID时出现问题
    • provideRules

      protected abstract ZoneRules provideRules(String zoneId, boolean forCaching)
      获取区域ID的规则的SPI方法。

      加载指定区域ID的规则。提供程序实现必须验证区域ID是否有效和可用,如果不是,则抛出ZoneRulesException。在有效情况下,方法的结果取决于缓存标志。

      如果提供程序实现不是动态的,则方法的结果必须是由ID选择的非null规则集。

      如果提供程序实现是动态的,则标志提供了一个选项,可以防止返回的规则在ZoneId中被缓存。当标志为true时,提供程序允许返回null,其中null将防止规则在ZoneId中被缓存。当标志为false时,提供程序必须返回非null规则。

      参数:
      zoneId - 由ZoneId定义的区域ID,不为null
      forCaching - 是否查询缓存的规则,如果返回的规则将被ZoneId缓存,则为true,如果它们将被返回给用户而不被ZoneId缓存,则为false
      返回:
      规则,如果forCaching为true且这是一个希望阻止在ZoneId中缓存的动态提供程序,则为null,否则不为null
      抛出:
      ZoneRulesException - 如果无法获取区域ID的规则
    • provideVersions

      protected abstract NavigableMap<String,ZoneRules> provideVersions(String zoneId)
      获取区域ID的规则历史的SPI方法。

      这将返回一个按版本字符串为键的历史规则映射。版本的确切含义和格式是特定于提供程序的。版本必须遵循词典顺序,因此返回的映射将按从最早已知规则到最新可用规则的顺序排列。默认的'TZDB'组使用由年份后跟一个字母组成的版本编号,例如'2009e'或'2012f'。

      实现必须为每个有效的区域ID提供结果,但它们不必提供规则的历史。因此,该映射将至少包含一个元素,并且只有在可用历史规则信息时才会包含多个元素。

      返回的版本在应用程序的生命周期内仍然可用和有效。动态提供程序可以随着更多数据变得可用而增加版本集。

      参数:
      zoneId - 由ZoneId定义的区域ID,不能为空
      返回:
      区域ID的规则历史的可修改副本,按从最旧到最新排序,不能为空
      抛出:
      ZoneRulesException - 如果无法获取区域ID的历史
    • provideRefresh

      protected boolean provideRefresh()
      从底层数据提供程序刷新规则的SPI方法。

      此方法提供了一个机会,供提供程序动态地重新检查底层数据提供程序以找到最新的规则。这可以用于在不停止JVM的情况下加载新规则。动态行为完全是可选的,大多数提供程序不支持它。

      此实现返回false。

      返回:
      如果规则已更新,则为true
      抛出:
      ZoneRulesException - 如果在刷新期间发生错误