Я думаю, что лучше всего пройти через все часовые пояса pytz и проверить, какой из них соответствует местному часовому поясу, каждый объект часового пояса pytz содержит информацию о utcoffset и tzname, например, CDT, EST, такую же информацию о местном времени можно получить из time.timezone/altzone
иtime.tzname
, и я думаю, что этого достаточно, чтобы правильно сопоставить местный часовой пояс в базе данных pytz, например:
import time
import pytz
import datetime
local_names = []
if time.daylight:
local_offset = time.altzone
localtz = time.tzname[1]
else:
local_offset = time.timezone
localtz = time.tzname[0]
local_offset = datetime.timedelta(seconds=-local_offset)
for name in pytz.all_timezones:
timezone = pytz.timezone(name)
if not hasattr(timezone, '_tzinfos'):
continue#skip, if some timezone doesn't have info
# go thru tzinfo and see if short name like EDT and offset matches
for (utcoffset, daylight, tzname), _ in timezone._tzinfos.iteritems():
if utcoffset == local_offset and tzname == localtz:
local_names.append(name)
print local_names
output:
['America / Atikokan', 'America / Bahia_Banderas',' Америка / Bahia_Banderas ',' Америка / Белиз ',' Америка / Cambridge_Bay ',' Америка / Канкун ',' Америка / Чикаго ',' Америка / Чихуахуа ',' Америка / Coral_Harbour ',' Америка / Costa_Rica ',«Америка / Эль-Сальвадор», «Америка / Форт-Уэйн», «Америка / Гватемала», «Америка / Индиана / Индианаполис», «Америка / Индиана / Нокс», «Америка / Индиана / Маренго», «Америка / Индиана / Маренго»,«Америка / Индиана / Петербург», «Америка / Индиана / Tell_City», «Америка / Индиана / Вевай», «Америка / Индиана / Винсеннес», «Америка / Индиана / Винамак», «Америка / Индианаполис», «Америка / Икалуит»',' Америка / Кентукки / Луисвилл ',' Америка / КентUcky / Луисвилл "," Америка / Кентукки / Монтиселло "," Америка / Knox_IN "," Америка / Луисвилл "," Америка / Луисвилл "," Америка / Манагуа "," Америка / Матаморос "," Америка / Меномини ","Америка / Мерида ',' Америка / Мексика_Город ',' Америка / Монтеррей ',' Америка / Северная_Дакота / Беула ',' Америка / Северная_Дакота / Центр ',' Америка / Северная_Дакота / Новый_Салем ',' Америка / Оджинага ',' Америка /Pangnirtung ',' America / Rainy_River ',' America / Rankin_Inlet ',' America / Resolute ',' America / Resolute ',' America / Тегусигальпа ',' America / Winnipeg ',' CST6CDT ',' Canada / Central ','Мексика / Генерал »,« США / Центральная »,« США / Восточная Индиана »,« США / Индиана-Старке »]
В производстве вы можете заранее создать такое отображение и сохранить его вместоитерация всегда.
Проверка сценария после изменения часового пояса:
$ export TZ = 'Австралия / Сидней'
$ python get_tz_names.py
['Антарктида / Macquarie', «Австралия / ACT», «Австралия / Брисбен», «Австралия / Канберра», «Австралия / Керри», «Австралия / Хобарт», «Австралия / Линде»человек »,« Австралия / Мельбурн »,« Австралия / Новый Южный Уэльс »,« Австралия / Квинсленд »,« Австралия / Сидней »,« Австралия / Тасмания »,« Австралия / Виктория »]