任何人都可以解释一下吗?
TimeZone tz1 = TimeZone.getTimeZone(“CST”); ==> ID of tz1 is CST
TimeZone tz2 = TimeZone.getTimeZone(“CDT”); ==> ID of tz2 is GMT ????
对我来说,以下测试代码会产生“未找到=> CDT”:
for (String tz : TimeZone.getAvailableIDs()) {
if (tz.equals("CDT")) {
System.out.println("Found: " + tz);
}
}
System.out.println("Not found => CDT");
这意味着java.util.TimeZone
将以documented的形式从不存在的CDT区域退回到“ GMT”:
返回:指定的时区,如果给定的ID,则返回GMT区域无法理解。
在Java 8中,您可以选择ZoneId,它没有不直观的回退行为,而是抛出了一个ZoneRulesException
,我认为它更好。
TimeZone.getTimeZone(“ CST”)
哇,那行没有意义。 CST
不是时区。
切勿使用2-4个字母的伪时区,例如PST
,PDT
,CST
,IST
等。这些不是实时区域。这些不是标准化的。这些甚至都不是唯一的!例如,我想您认为CST
是“中央标准时间”。但是CST
也是“中国标准时间”。
以proper time zone name的格式指定Continent/Region
,例如America/Montreal
,Africa/Casablanca
或Pacific/Auckland
。切勿使用2-4个字母的缩写,例如EST
或IST
,因为它们是not真实时区,不是标准化的,甚至不是唯一(!)。
ZoneId z = ZoneId.of( "Africa/Tunis" ) ;
ZoneId
挖掘发现您感兴趣的区域所使用的实时区域。如果用CST
表示北美中西部的时区之一,也许您的意思确实是America/Chicago
或America/Winnipeg
。
ZoneId z = ZoneId.of( "America/Chicago" ) ;
America/Chicago
时区参与了称为Daylight Saving Time (DST)的愚蠢行为。因此,我们可以询问是否正在使用DST。媒体发布CST
或CDT
时,此DST的当前状态是否正在使用。
ZoneRules
获取该时区的规则。
ZoneRules rules = z.getRules() ;
Instant
询问DST的状态和特定时刻的偏移量。我们将在此处使用当前时刻。
Instant now = Instant.now() ;
now.toString():2020-02-10T00:06:26.000116Z
ZonedDateTime
看在我们时区的同一时刻。
ZonedDateTime zdt = now.atZone( z ) ;
zdt.toString():2020-02-09T18:06:26.000116-06:00 [美国/芝加哥]
现在询问偏移量和夏令时。
ZoneOffset offset = rules.getOffset( now ); boolean inDST = rules.isDaylightSavings( now );
offset.toString():-06:00
inDST:假