有人可以解释一下这个吗?
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
会从不存在的CDT区域回退到"GMT",如文档所述:
在Java 8中,您可以选择使用ZoneId,它没有令人困惑的后备行为,而是抛出一个我认为更好的返回:指定的TimeZone,如果无法理解给定的ID,则为GMT区域。
ZoneRulesException
。CST
和CDT
不是时区。
请使用真正的时区,例如America/Chicago
。
ZoneId
.of( "America/Chicago" )
.getRules()
.isDaylightSavings(
Instant.now()
)
false
TimeZone.getTimeZone(“CST”)
糟糕,那一行没有意义。CST
不是一个时区。
永远不要使用2-4个字母的伪时区,例如PST
、PDT
、CST
、IST
等。这些不是真正的时区,也没有标准化,甚至不是唯一的!例如,我猜你认为CST
是“中央标准时间”。但是CST
也是“中国标准时间”。
请以大陆/地区
的格式指定正确的时区名称,例如America/Montreal
、Africa/Casablanca
或Pacific/Auckland
。永远不要使用2-4个字母的缩写,例如EST
或IST
,因为它们不是真正的时区,没有标准化,甚至不是唯一的!
ZoneId z = ZoneId.of( "Africa/Tunis" ) ;
ZoneId
挖掘以发现您感兴趣的区域使用的实时时区。如果您通过CST
指的是北美中西部的某个时区,也许您真正需要的是像America/Chicago
或America/Winnipeg
这样的东西。
ZoneId z = ZoneId.of( "America/Chicago" ) ;
America/Chicago
时区参与所谓的夏令时(DST),因此我们可以询问当前是否正在使用DST。当媒体发布CST
或CDT
时,这表示DST当前是否在使用。
ZoneRules
获取该时区的规则。
ZoneRules rules = z.getRules() ;
即时
查询特定时刻的夏令时状态和偏移量。这里我们将使用当前时刻。
Instant now = Instant.now() ;
now.toString(): 2020-02-10T00:06:26.000116Z
ZonedDateTime
以我们的时区查看同一时刻。
ZonedDateTime zdt = now.atZone( z ) ;
ZoneOffset offset = rules.getOffset( now );
boolean inDST = rules.isDaylightSavings( now );
offset.toString(): -06:00
inDST: false
America/Chicago
。它包括CST和CDT两个时区。 - Matt Johnson-Pint