您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

使用新的java.time API时区的解析非常慢

使用新的java.time API时区的解析非常慢

如您的问题和我的评论中所述,每次需要解析时区时,ZoneRulesProvider.getAvailableZoneIds()都会创建一组新的所有可用时区的字符串表示形式(的键static final ConcurrentMap<String, ZoneRulesProvider> ZONES)。1个

幸运的是,a ZoneRulesProvider一个abstract旨在被子类化的类。该方法protected abstract Set<String> provideZoneIds()负责填充ZONES。因此,如果子类提前知道要使用的 所有 时区,则只能提供所需的时区。由于该类提供的条目要少于包含数百个条目的认提供程序,因此它有可能显着减少的调用时间getAvailableZoneIds()

ZoneRulesProvider API提供了如何注册一个指令。请注意,不能取消注册提供程序,只能对其进行补充,因此,删除认提供程序并添加您自己的提供程序不是一件简单的事情。系统属性java.time.zone.DefaultZoneRulesProvider定义认提供程序。如果返回null(通过System.getProperty("..."),则将加载JVM的臭名昭著的提供程序。使用System.setProperty("...", "fully-qualified name of a concrete ZoneRulesProvider class")一个可以提供自己的提供程序,这就是第二段中讨论的提供程序。

最后,我建议:

我自己没有这样做,但是我 确信它会因为某种原因而失败,因为 它会起作用。

1在问题注释中建议,在1.8版本之间,调用的确切性质可能已更改。

找到更多信息

上述ZoneRulesProviderfinal class TzdbZoneRulesProvider位于中java.time.zone。从路径中读取该类中的区域:(JAVA_HOME/lib/tzdb.dat在我的情况下,它在JDK的JRE中)。该文件确实包含许多区域,下面是一个片段:

 TZDB  2014cJ Africa/Abidjan Africa/Accra Africa/Addis_Ababa Africa/Algiers 
Africa/Asmara 
Africa/Asmera 
Africa/Bamako 
Africa/Bangui 
Africa/Banjul 
Africa/Bissau Africa/Blantyre Africa/Brazzaville Africa/Bujumbura Africa/Cairo Africa/Casablanca Africa/Ceuta Africa/Conakry Africa/Dakar Africa/Dar_es_Salaam Africa/Djibouti 
Africa/Douala Africa/El_Aaiun Africa/Freetown Africa/Gaborone 
Africa/Harare Africa/Johannesburg Africa/Juba Africa/Kampala Africa/Khartoum 
Africa/Kigali Africa/Kinshasa Africa/Lagos Africa/Libreville Africa/Lome 
Africa/Luanda Africa/Lubumbashi 
Africa/Lusaka 
Africa/Malabo 
Africa/Maputo 
Africa/Maseru Africa/Mbabane Africa/Mogadishu Africa/Monrovia Africa/Nairobi Africa/Ndjamena 
Africa/Niamey Africa/Nouakchott Africa/Ouagadougou Africa/Porto-Novo Africa/Sao_Tome Africa/Timbuktu Africa/Tripoli Africa/Tunis Africa/Windhoek America/Adak America/Anchorage America/Anguilla America/Antigua America/Araguaina America/Argentina/Buenos_Aires America/Argentina/Catamarca  America/Argentina/ComodRivadavia America/Argentina/Cordoba America/Argentina/Jujuy America/Argentina/La_Rioja America/Argentina/Mendoza America/Argentina/Rio_Gallegos America/Argentina/Salta America/Argentina/San_Juan America/Argentina/San_Luis America/Argentina/Tucuman America/Argentina/Ushuaia 
America/Aruba America/Asuncion America/Atikokan America/Atka 
America/Bahia

然后,如果找到了一种仅用所需区域创建类似文件并加载该区域的方法,那么性能问题 可能 肯定无法解决

java 2022/1/1 18:27:53 有498人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶