模块 java.base

类 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 类的完全限定名称,使用系统类加载器作为默认提供者加载。如果未定义此系统属性,系统默认提供程序将被加载以用作默认提供程序。

规则主要由 ZoneId 使用的区域 ID 查找。只能使用区域区域 ID,此处不使用区域偏移 ID。

时区规则是政治性的,因此数据可以随时更改。每个提供商都会为每个区域 ID 提供最新的规则,但他们也可能会提供规则更改的历史记录。

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

提供者必须确保应用程序看到规则后,该规则必须继续可用。

鼓励提供者实施有意义的 toString 方法。

许多系统希望在不停止 JVM 的情况下动态更新时区规则。如果仔细研究,这是一个复杂的问题。提供者可以选择处理动态更新,但默认提供者不会。

自从:
1.8
  • 构造方法详细信息

    • ZoneRulesProvider

      protected ZoneRulesProvider()
      构造函数。
  • 方法详情

    • getAvailableZoneIds

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

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

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

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

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

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

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

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

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

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

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

      实现必须为每个有效的区域 ID 提供一个结果,但是它们不必提供规则的历史记录。因此,map将始终包含一个元素,并且如果历史规则信息可用,则只会包含一个以上的元素。

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

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

      这为当前可用的提供程序添加了一个新的提供程序。提供商为一个或多个区域 ID 提供规则。如果提供商提供的区域 ID 已注册,则无法注册。请参阅 ZoneId 中关于时区 ID 的注释,尤其是关于使用“组”概念使 ID 唯一的部分。

      为确保已创建时区的完整性,无法注销提供商。

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

      public static boolean refresh()
      刷新来自底层数据提供者的规则。

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

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

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

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

      这将获取此 ZoneRulesProvider 提供的 ID。供应商应提供至少一个区域 ID 的数据。

      返回的区域 ID 在应用程序的生命周期内保持可用和有效。随着更多数据可用,动态提供程序可能会增加 ID 集。

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

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

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

      如果提供者实现不是动态的,则该方法的结果必须是 ID 选择的非空规则集。

      如果提供程序实现是动态的,则该标志提供了防止返回的规则缓存在 ZoneId 中的选项。当标志为真时,允许提供者返回 null,其中 null 将阻止规则缓存在 ZoneId 中。当标志为 false 时,提供者必须返回非空规则。

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

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

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

      实现必须为每个有效的区域 ID 提供一个结果,但是它们不必提供规则的历史记录。因此map将包含至少一个元素,并且如果历史规则信息可用则将只包含一个以上的元素。

      返回的版本在应用程序的生命周期内保持可用和有效。随着更多数据可用,动态提供程序可能会增加版本集。

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

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

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

      此实现返回 false。

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