TimeZone ID不正确地进入夏令时

问题描述 投票:2回答:2

任何人都可以解释一下吗?

TimeZone tz1 = TimeZone.getTimeZone(“CST”); ==> ID of tz1 is CST
TimeZone tz2 = TimeZone.getTimeZone(“CDT”); ==> ID of tz2 is GMT ????
java timezone
2个回答
1
投票

对我来说,以下测试代码会产生“未找到=> 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,我认为它更好。


0
投票

伪时区

TimeZone.getTimeZone(“ CST”)

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

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

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

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 [美国/芝加哥]

现在询问偏移量和夏令时。

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

© www.soinside.com 2019 - 2024. All rights reserved.