在我的Android应用程序中,为什么EST时区总是为useDaylightTime()
返回false。它发现EST使用夏令时但该方法总是返回false(参考:time zone list)。
TimeZone tz = TimeZone.getTimeZone("EST");
if(tz.useDaylightTime()){
//Never enters here
}
请有人帮我弄清楚出了什么问题?我不太了解这个话题,我很欣赏任何有关这个主题的想法。
关于我所面临的情况的更多信息:我知道“EDT”是用于表示夏令时时区的时区的ID,但在我的情况下,时区ID是从服务器端收到的,我正在使用那个来知道夏令时适用于该时区。
不要依赖三个和四个字母的时区缩写。他们很暧昧。 EST可以参考北美东部标准时间或澳大利亚东部标准时间(不知道是否还有更多)。而是使用区域/城市格式的时区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() ) ;
为了让东部时间返回true,请不要使用该标准时间的ID,而是使用“America / New_York”:
TimeZone timeZone = TimeZone.getTimeZone("America/New_York");
if(timeZone.useDaylightTime()){
Log.d(TAG, "Uses daylight savings time...");
}