#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...");
}