此类管理时区规则的配置。静态方法提供可用于管理提供程序的公共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 Summary
-
Method Summary
Modifier and TypeMethodDescription获取可用区域ID的集合。static ZoneRules
获取区域ID的规则。static NavigableMap
<String, ZoneRules> getVersions
(String zoneId) 获取区域ID的规则历史。protected boolean
从底层数据提供程序刷新规则的SPI方法。protected abstract ZoneRules
provideRules
(String zoneId, boolean forCaching) 获取区域ID的规则的SPI方法。protected abstract NavigableMap
<String, ZoneRules> provideVersions
(String zoneId) 获取区域ID的规则历史的SPI方法。获取可用区域ID的SPI方法。static boolean
refresh()
从底层数据提供程序刷新规则。static void
registerProvider
(ZoneRulesProvider provider) 注册区域规则提供程序。
-
Constructor Details
-
ZoneRulesProvider
protected ZoneRulesProvider()构造函数。
-
-
Method Details
-
getAvailableZoneIds
获取可用区域ID的集合。这些ID是
ZoneId
的字符串形式。- 返回:
- 不可修改的区域ID集合,不为null
-
getRules
获取区域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
获取区域ID的规则历史。时区由政府定义并经常更改。此方法允许应用程序查找单个区域ID的规则更改历史。该映射以与规则相关联的版本字符串为键。
版本的确切含义和格式是特定于提供程序的。版本必须遵循词典顺序,因此返回的映射将按照已知规则的最旧到最新可用规则的顺序排序。默认的'TZDB'组使用由年份后跟字母组成的版本编号,例如'2009e'或'2012f'。
实现必须为每个有效的区域ID提供结果,但它们不必提供规则历史。因此,映射将始终包含一个元素,并且仅在可用历史规则信息时才会包含多个元素。
- 参数:
-
zoneId
- 由ZoneId
定义的区域ID,不为null - 返回:
- 区域ID的规则历史的可修改副本,从最旧到最新排序,不为null
- 抛出:
-
ZoneRulesException
- 如果无法获取区域ID的历史
-
registerProvider
注册区域规则提供程序。这将添加一个新的提供程序到当前可用的提供程序中。提供程序为一个或多个区域ID提供规则。如果提供程序提供已经注册的区域ID,则无法注册提供程序。请参阅关于在
ZoneId
中使用时区ID概念的注意事项,特别是关于使用“组”概念使ID唯一的部分。为了确保已创建的时区的完整性,没有办法取消注册提供程序。
- 参数:
-
provider
- 要注册的提供程序,不为null - 抛出:
-
ZoneRulesException
- 如果区域ID已经注册
-
refresh
public static boolean refresh()从底层数据提供程序刷新规则。此方法允许应用程序请求提供程序检查所提供规则的任何更新。调用此方法后,任何
ZonedDateTime
中存储的偏移量可能对区域ID无效。规则的动态更新是一个复杂的问题,大多数应用程序不应使用此方法或动态规则。要实现动态规则,必须按照此类的规范编写提供程序实现。此外,
ZoneRules
的实例不得在应用程序中缓存,因为它们将变得过时。但是,provideRules(String, boolean)
上的布尔标志允许提供程序实现控制ZoneId
的缓存,可能确保系统中的所有对象看到新规则。请注意,动态规则提供程序的性能成本可能较高。还要注意,此规范中没有动态规则提供程序。- 返回:
- 如果规则已更新,则为true
- 抛出:
-
ZoneRulesException
- 如果刷新期间发生错误
-
provideZoneIds
获取可用区域ID的SPI方法。这获取此
ZoneRulesProvider
提供的ID。提供程序应至少为一个区域ID提供数据。返回的区域ID在应用程序的生命周期内仍然可用和有效。动态提供程序可以随着更多数据的可用而增加ID集。
- 返回:
- 提供的区域ID集,不为null
- 抛出:
-
ZoneRulesException
- 如果提供ID时出现问题
-
provideRules
获取区域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
获取区域ID的规则历史的SPI方法。这将返回一个按版本字符串为键的历史规则映射。版本的确切含义和格式是特定于提供程序的。版本必须遵循词典顺序,因此返回的映射将按从最早已知规则到最新可用规则的顺序排列。默认的'TZDB'组使用由年份后跟一个字母组成的版本编号,例如'2009e'或'2012f'。
实现必须为每个有效的区域ID提供结果,但它们不必提供规则的历史。因此,该映射将至少包含一个元素,并且只有在可用历史规则信息时才会包含多个元素。
返回的版本在应用程序的生命周期内仍然可用和有效。动态提供程序可以随着更多数据变得可用而增加版本集。
- 参数:
-
zoneId
- 由ZoneId
定义的区域ID,不能为空 - 返回:
- 区域ID的规则历史的可修改副本,按从最旧到最新排序,不能为空
- 抛出:
-
ZoneRulesException
- 如果无法获取区域ID的历史
-
provideRefresh
protected boolean provideRefresh()从底层数据提供程序刷新规则的SPI方法。此方法提供了一个机会,供提供程序动态地重新检查底层数据提供程序以找到最新的规则。这可以用于在不停止JVM的情况下加载新规则。动态行为完全是可选的,大多数提供程序不支持它。
此实现返回false。
- 返回:
- 如果规则已更新,则为true
- 抛出:
-
ZoneRulesException
- 如果在刷新期间发生错误
-