哪些三个字母的时区ID不被弃用



TimeZone:的Javadoc中存在弃用警告

为了与JDK1.1.x兼容,还支持其他一些三个字母的时区ID(如"PST"、"CTT"、"AST")。然而,他们的使用是不赞成的。。。

这里说的是"其他",但我看不出它在哪里定义了哪些三个字母的ID是不推荐使用的。这些记录在哪里?

文档中提到GMT作为回退,因此可以放心地假设它是一个不推荐使用的ID;但是:

  • 是否弃用UTC?您打算使用Etc/UTC吗?还是应该使用GMT?(TimeZone.getTimeZone("UTC").hasSameRules(TimeZone.getTimeZone("GMT")为真)
  • CET(中欧时间)是否已弃用?如果没有,您应该使用哪个时区标识符?根据这个演示,只有一个其他标识符产生相同的规则,那就是MET(欧洲中部时间)。

    还有另一个时区IDECT,它的显示名称与CET(中欧时间)相同,但没有相同的规则(我认为它们在20世纪70年代中期有所不同),它与Europe/Paris具有相同的规则。但是,由于它们有不同的规则,这两者是不可交换的。

因此,我的结论是,支持的三个字母ID的最小集合是GMTCET;但这似乎很奇怪,没有记录在案。有什么想法吗?


我注意到@shmosel:Is";GMT";Java时区中的缩写,如果可以使用它吗?。这在一定程度上涵盖了我的问题;但我问的是一个更普遍的问题"支持什么(以及我们如何知道)",而不仅仅是"X支持吗"。

首先,回答您的具体问题:

  1. 所有基于缩写的标识符都应被视为已弃用。它们不足以在保留所有细节的情况下识别特定时区。例如,您可以在此处查看所有使用中欧时间的地点。有的全年使用CET,有的冬季使用CET,夏季使用CEST。其中,并非所有国家都使用相同的夏令时过渡日,或在其历史上具有相同的时区偏移。CET中没有足够的信息来决定使用哪一组规则。

  2. 使用GMTUTC是相对安全的,因为它们是明确的。然而,使用CCD_ 20或CCD_。如果你只选择一个,IMHO应该是Etc/UTC

  3. CET和其他缩写应该被视为弃用,正如我所提到的。然而,值得注意的是,一些缩写(如CET)来自TZ数据库,一些缩写(如AST)来自Java的遗留版本。这种区别很重要,因为只有TZDB在数据中有用,这些数据可以传输到其他地方并由非基于Java的系统进行解释。

    特别需要注意的是,即使MSTEST,TZDB中的美国缩写PSTCST也是而非

  4. 您应该选择与您的场景相关的基于位置的时区,而不是CET。如果您谈论的是法国,请使用Europe/Paris。如果你谈论的是波兰,请使用Europe/Warsaw

接下来,了解底层TZ数据库有几种可接受使用的标识符:

  • 基于位置,以Area/Locality的形式

    • 例如:America/New_YorkEurope/LondonPacific/Honolulu
  • 基于位置,以Area/Region/Locality的形式

    • 例如:America/Argentina/Buenos_AiresAmerica/Indiana/Knox
  • 管理区域,在Etc命名空间中:

    • 例如:Etc/UTCEtc/GMT+2Etc/GMT-5
    • +/-基于POSIX标准,与通常预期的ISO标准相反
    • 常用于海上船舶

它还有几种形式是历史的产物,应该不再使用

  • 基于位置,以CountryCountry/StateOrRegion的形式

    • 例如:US/PacificUS/HawaiiBrazil/EastCanada/NewfoundlandEgyptCuba
  • 美国大陆的POSIX标识符:

    • 例如:EST5EDTCST6CDTMST7MDTPST8PDT
  • 缩写词-其中一些缩写词

    • 例如:ESTEETPRCWET

此外,Java之前已经扩展了这些标识符,以包括TZ数据库中NOT部分的其他缩写。我能够在这里找到它们,作为它们对应的TZ数据库现代标识符的链接:

Link Australia/Darwin ACT 
Link Australia/Sydney AET 
Link America/Argentina/Buenos_Aires AGT 
Link Africa/Cairo ART 
Link America/Anchorage AST 
Link America/Sao_Paulo BET 
Link Asia/Dhaka BST 
Link Africa/Harare CAT 
Link America/St_Johns CNT 
Link America/Chicago CST 
Link Asia/Shanghai CTT 
Link Africa/Addis_Ababa EAT 
Link Europe/Paris ECT 
Link America/New_York EST 
Link Pacific/Honolulu HST 
Link America/Indianapolis IET 
Link Asia/Calcutta IST 
Link Asia/Tokyo JST 
Link Pacific/Apia MIT 
Link America/Denver MST 
Link Asia/Yerevan NET 
Link Pacific/Auckland NST 
Link Asia/Karachi PLT 
Link America/Phoenix PNT 
Link America/Puerto_Rico PRT 
Link America/Los_Angeles PST 
Link Pacific/Guadalcanal SST 
Link Asia/Saigon VST 

当然,这些映射可能是有意见的,也可能不是有意见的——但据报道,Java的TZUpdater工具使用这些映射来继续支持这些遗留的Java时区缩写。

也许ZoneId可以用作引用。

ZoneId.getAvailableZoneIds().stream()
.filter(z -> z.length() == 3)
.forEach(System.out::println);

输出

GMT
CET
UTC
ROK
MET
PRC
WET
UCT
EET

如果你调用ZoneId.of("CST"),它会抛出

java.time.zone.ZoneRulesException: Unknown time-zone ID: CST

相关内容

  • 没有找到相关文章

最新更新