TimeZone ID在白天时间不正确

时间:2014-03-10 20:20:33

标签: java timezone

有人可以解释一下吗?

TimeZone tz1 = TimeZone.getTimeZone(“CST”); ==> ID of tz1 is CST
TimeZone tz2 = TimeZone.getTimeZone(“CDT”); ==> ID of tz2 is GMT ????

2 个答案:

答案 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)

tl; dr

CSTCDT not 时区。

使用实时区域,例如America/Chicago

ZoneId
.of( "America/Chicago" ) 
.getRules()
.isDaylightSavings( 
    Instant.now()
)

false

伪时区

TimeZone.getTimeZone(“ CST”)

哎呀,那行没有意义。 CST不是时区。

切勿使用2-4个字母的伪时区,例如PSTPDTCSTIST等。这些不是实时区域。这些不是标准化的。这些甚至都不是唯一的!例如,我想您认为CST是“中央标准时间”。但是CST也是“中国标准时间”。

Continent/Region的格式指定proper time zone name,例如America/MontrealAfrica/CasablancaPacific/Auckland。切勿使用2-4个字母的缩写,例如ESTIST,因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!)。

ZoneId z = ZoneId.of( "Africa/Tunis" ) ;  

ZoneId

挖掘以发现您感兴趣的区域所使用的实时区域。如果用CST来指北美中西部的时区之一,也许您实际上是指类似America/ChicagoAmerica/Winnipeg的时区。

ZoneId z = ZoneId.of( "America/Chicago" ) ;  

America/Chicago时区参与了称为Daylight Saving Time (DST)的愚蠢行为。因此,我们可以询问是否正在使用DST。媒体发布CSTCDT时,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:否

请参阅此code run live at IdeOne.com

Table of date-time types in Java, both modern and legacy