Android: почему часовой пояс с идентификатором "EST" возвращает false для useDaylightTime () - PullRequest
0 голосов
/ 26 марта 2019

В моем приложении для Android почему часовой пояс EST всегда возвращает false для useDaylightTime(). Обнаружено, что EST использует летнее время, но метод всегда возвращает false (ссылка: список часовых поясов ).

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

Пожалуйста, кто-нибудь может помочь мне выяснить, что происходит не так? Я не знаю много о теме, я ценю любые усилия, чтобы получить идею об этом.

Еще немного информации о ситуации, с которой я сталкиваюсь: я знаю, что «EDT» - это идентификатор, используемый для часового пояса, представляющего часовой пояс для перехода на летнее время, но в моем случае идентификатор часового пояса получен со стороны сервера, и я использую его один из них знает, что летнее время применимо к этому часовому поясу.

Ответы [ 2 ]

3 голосов
/ 26 марта 2019

Не полагайтесь на трех- и четырехбуквенные сокращения часовых поясов. Они неоднозначны. EST может относиться к североамериканскому восточному стандартному времени или австралийскому восточному стандартному времени (не знаю, есть ли еще). Вместо этого используйте идентификатор часового пояса в формате регион / город , например, Америка / Нью-Йорк или Австралия / Сидней. См. Википедию для списка .

Чтобы ответить на ваш вопрос: TimeZone интерпретирует EST как фиксированное смещение UTC -05: 00. Так что у него нет летнего времени. Вы можете сказать, что это логично: переход на летнее время не является стандартным временем. Аббревиатура для восточного перехода на летнее время была бы вместо EDT.

ZoneId

Теперь мы находимся в этом, класс TimeZone устарел и плохо спроектирован. Если вы можете, загляните в java.time, современный API даты и времени Java и его ZoneId класс.

ZoneId zoneId = ZoneId.of( "America/New_York" ) ;
ZoneRules rules = zoneId.getRules() ;
boolean isNowInDst = rules.isDaylightSavings( Instant.now() ) ;
2 голосов
/ 26 марта 2019

Чтобы восточное время вернуло true, не используйте идентификатор для этого стандартного времени, вместо этого используйте «America / New_York»:

TimeZone timeZone = TimeZone.getTimeZone("America/New_York");
if(timeZone.useDaylightTime()){
  Log.d(TAG, "Uses daylight savings time...");
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...