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
(欧洲中部时间)。还有另一个时区ID
ECT
,它的显示名称与CET
(中欧时间)相同,但没有相同的规则(我认为它们在20世纪70年代中期有所不同),它与Europe/Paris
具有相同的规则。但是,由于它们有不同的规则,这两者是不可交换的。
因此,我的结论是,支持的三个字母ID的最小集合是GMT
和CET
;但这似乎很奇怪,没有记录在案。有什么想法吗?
我注意到@shmosel:Is";GMT";Java时区中的缩写,如果可以使用它吗?。这在一定程度上涵盖了我的问题;但我问的是一个更普遍的问题"支持什么(以及我们如何知道)",而不仅仅是"X支持吗"。
首先,回答您的具体问题:
-
所有基于缩写的标识符都应被视为已弃用。它们不足以在保留所有细节的情况下识别特定时区。例如,您可以在此处查看所有使用中欧时间的地点。有的全年使用
CET
,有的冬季使用CET
,夏季使用CEST
。其中,并非所有国家都使用相同的夏令时过渡日,或在其历史上具有相同的时区偏移。CET
中没有足够的信息来决定使用哪一组规则。 -
使用
GMT
或UTC
是相对安全的,因为它们是明确的。然而,使用CCD_ 20或CCD_。如果你只选择一个,IMHO应该是Etc/UTC
。 -
CET
和其他缩写应该被视为弃用,正如我所提到的。然而,值得注意的是,一些缩写(如CET
)来自TZ数据库,一些缩写(如AST
)来自Java的遗留版本。这种区别很重要,因为只有TZDB在数据中有用,这些数据可以传输到其他地方并由非基于Java的系统进行解释。特别需要注意的是,即使
MST
和EST
是,TZDB中的美国缩写PST
和CST
也是而非。 -
您应该选择与您的场景相关的基于位置的时区,而不是
CET
。如果您谈论的是法国,请使用Europe/Paris
。如果你谈论的是波兰,请使用Europe/Warsaw
等
接下来,了解底层TZ数据库有几种可接受使用的标识符:
-
基于位置,以
Area/Locality
的形式- 例如:
America/New_York
、Europe/London
、Pacific/Honolulu
- 例如:
-
基于位置,以
Area/Region/Locality
的形式- 例如:
America/Argentina/Buenos_Aires
、America/Indiana/Knox
- 例如:
-
管理区域,在
Etc
命名空间中:- 例如:
Etc/UTC
、Etc/GMT+2
、Etc/GMT-5
- +/-基于POSIX标准,与通常预期的ISO标准相反
- 常用于海上船舶
- 例如:
它还有几种形式是历史的产物,应该不再使用:
-
基于位置,以
Country
或Country/StateOrRegion
的形式- 例如:
US/Pacific
、US/Hawaii
、Brazil/East
、Canada/Newfoundland
、Egypt
、Cuba
- 例如:
-
美国大陆的POSIX标识符:
- 例如:
EST5EDT
、CST6CDT
、MST7MDT
、PST8PDT
- 例如:
-
缩写词-其中一些缩写词
- 例如:
EST
、EET
、PRC
、WET
- 例如:
此外,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