Android: Почему часовой пояс с идентификатором «EST» возвращает false для useDaylightTime()

#android #timezone #dst

#Android #Часовой пояс #летнее время

Вопрос:

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

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

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

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

Ответ №1:

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

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

ZoneId

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

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

Комментарии:

1. Спасибо за быстрый ответ, он мне очень помог.

2. @Basil Спасибо за замечательную правку. Подробности действительно полезны.

Ответ №2:

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

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