Android:为啥 ID 为“EST”的时区为 useDaylightTime() 返回 false

Posted

技术标签:

【中文标题】Android:为啥 ID 为“EST”的时区为 useDaylightTime() 返回 false【英文标题】:Android : Why Time Zone with id "EST" returns false for useDaylightTime()Android:为什么 ID 为“EST”的时区为 useDaylightTime() 返回 false 【发布时间】:2019-08-16 22:38:14 【问题描述】:

在我的 android 应用程序中,为什么 EST 时区总是为 useDaylightTime() 返回 false。它发现 EST 使用夏令时,但该方法总是返回 false(参考:time zone list)。

   TimeZone tz = TimeZone.getTimeZone("EST");
    if(tz.useDaylightTime())
    //Never enters here
    

请任何人都可以帮助我找出问题所在?我对这个主题了解不多

有关我所面临情况的更多信息:我知道“EDT”是用于表示夏令时时区的时区 ID,但在我的情况下,时区 ID 是从服务器端接收的,我正在使用它要知道夏令时是否适用于该时区。

【问题讨论】:

【参考方案1】:

不要依赖三个和四个字母的时区缩写。他们是模棱两可的。 EST可能指的是北美东部标准时间或澳大利亚东部标准时间(不知道是否还有更多)。而是使用 region/city 格式的时区 ID,例如 America/New_York 或 Australia/Sydney。见Wikipedia for list。

回答您的问题:TimeZone 将 EST 解释为 -05:00 的固定 UTC 偏移量。所以它没有任何夏令时。你可能会说这是合乎逻辑的:夏令时不是标准时间。东部夏令时的缩写应该是 EDT。

ZoneId

现在我们知道了,TimeZone 类已经过时并且设计不佳。如果可以,请查看 java.time、现代 Java 日期和时间 API,以及它的 ZoneId 类。

ZoneId zoneId = ZoneId.of( "America/New_York" ) ;
ZoneRules rules = zoneId.getRules() ;
boolean isNowInDst = rules.isDaylightSavings( Instant.now() ) ;

【讨论】:

感谢您的快速回答,对我帮助很大。 @Basil 感谢您的精彩编辑。细节真的很有帮助。【参考方案2】:

为了让东部时间返回 true,请勿使用该标准时间的 ID,而是使用“America/New_York”:

TimeZone timeZone = TimeZone.getTimeZone("America/New_York");
if(timeZone.useDaylightTime())
  Log.d(TAG, "Uses daylight savings time...");

【讨论】:

以上是关于Android:为啥 ID 为“EST”的时区为 useDaylightTime() 返回 false的主要内容,如果未能解决你的问题,请参考以下文章

如何在javascript中将日期时间从用户时区转换为EST [重复]

如何将时间转换为 iPhone 设备的时区?

在 Python 3 的 Pytz 模块中将 EST、CST 和 DST 时区转换为 unix 时间戳

Java - 日期时区转换

修改Centos7系统中的时区

如何将时间从 UTC 转换为 EST?