有人可以解释一下吗?
TimeZone tz1 = TimeZone.getTimeZone(“CST”); ==> ID of tz1 is CST
TimeZone tz2 = TimeZone.getTimeZone(“CDT”); ==> ID of tz2 is GMT ????
答案 0 :(得分:1)
对我来说,下面的测试代码会产生“Not found => 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”documented:
返回:指定的TimeZone,如果给定ID,则返回GMT区域 无法理解。
在Java 8中,您可以使用ZoneId的替代方法,它不具有不直观的回退行为,而是抛出我认为更好的ZoneRulesException
。
答案 1 :(得分:0)
CST
和CDT
是 not 时区。
使用实时区域,例如America/Chicago
。
ZoneId
.of( "America/Chicago" )
.getRules()
.isDaylightSavings(
Instant.now()
)
false
TimeZone.getTimeZone(“ CST”)
哎呀,那行没有意义。 CST
不是时区。
切勿使用2-4个字母的伪时区,例如PST
,PDT
,CST
,IST
等。这些不是实时区域。这些不是标准化的。这些甚至都不是唯一的!例如,我想您认为CST
是“中央标准时间”。但是CST
也是“中国标准时间”。
以Continent/Region
的格式指定proper time zone name,例如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
时区参与了称为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 [美国/芝加哥]
现在询问偏移量和DST。
ZoneOffset offset = rules.getOffset( now );
boolean inDST = rules.isDaylightSavings( now );
offset.toString():-06:00
inDST:否