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 [重复]