Получить список часовых поясов с разницей во времени от GMT - PullRequest
0 голосов
/ 28 мая 2019

У меня есть приложение Django, и у меня есть список жестко закодированных часовых поясов. Я знаю, pytz можно использовать для получения списка всех часовых поясов. Но это не показывает разницу во времени относительно GMT. Подскажите, пожалуйста, как получить такой список.

TIMEZONE_CHOICES = (
    ("<DstTzInfo 'Africa/Abidjan' LMT-1 day, 23:44:00 STD>", "<DstTzInfo 'Africa/Abidjan' LMT-1 day, 23:44:00 STD>"),
    ("<DstTzInfo 'Africa/Accra' LMT-1 day, 23:59:00 STD>", "<DstTzInfo 'Africa/Accra' LMT-1 day, 23:59:00 STD>"),
    ("<DstTzInfo 'Africa/Addis_Ababa' LMT+2:27:00 STD>", "<DstTzInfo 'Africa/Addis_Ababa' LMT+2:27:00 STD>"),
    ("<DstTzInfo 'Africa/Algiers' LMT+0:12:00 STD>", "<DstTzInfo 'Africa/Algiers' LMT+0:12:00 STD>"),
    ("<DstTzInfo 'Africa/Asmara' LMT+2:27:00 STD>", "<DstTzInfo 'Africa/Asmara' LMT+2:27:00 STD>"),...)

1 Ответ

2 голосов
/ 28 мая 2019

Предполагая, что разница во времени от UTC является приемлемой альтернативой GMT (UTC и GMT почти, но не совпадают), вы можете получить смещение часового пояса и связанную информацию от объекта pytz.timezone.

Для часовых поясов с несколькими смещениями (в связи с переходом на летнее время, историческими изменениями и т. Д.) Соответствующие зоны и смещения можно получить из атрибута _tzinfos. Для часовых поясов с одним смещением вы можете получить смещение из атрибута _utcoffset.

В следующем примере создается диктовка, в которой каждый часовой пояс в pytz.all_timezones является ключом, а значение - списком кортежей, содержащих информацию о соответствующей зоне и смещении.

from pytz import all_timezones, timezone

timezones = {}
for tz in all_timezones:
    tzinfos = getattr(timezone(tz), '_tzinfos', None)
    if tzinfos:
        timezones[tz] = [(zone, str(offset)) for offset, dst, zone in tzinfos]
    else:
        timezones[tz] = [(tz, str(timezone(tz)._utcoffset))]

print(timezones)
# {
#     'Africa/Abidjan': [('LMT', '-1 day, 23:44:00'), ('GMT', '0:00:00')],
#     'Africa/Accra': [('LMT', '-1 day, 23:59:00'), ('GMT', '0:00:00'), ('+0020', '0:20:00')],
#     'Africa/Addis_Ababa': [('LMT', '2:27:00'), ('EAT', '3:00:00'), ('+0230', '2:30:00'), ('+0245', '2:45:00')],
#     'Africa/Algiers': [('LMT', '0:12:00'), ('PMT', '0:09:00'), ('WET', '0:00:00'), ('WEST', '1:00:00'), ('CET', '1:00:00'), ('CEST', '2:00:00')],
#     'Africa/Asmara': [('LMT', '2:27:00'), ('EAT', '3:00:00'), ('+0230', '2:30:00'), ('+0245', '2:45:00')],
#     ...
#     }

Если вы предпочитаете список, в котором информация для каждой зоны объединена в строку (как в вашем примере), то вы можете изменить ее следующим образом.

timezones = []
for tz in all_timezones:
    tzinfos = getattr(timezone(tz), '_tzinfos', None)
    if tzinfos:
        timezones.extend([' '.join([tz, zone, str(offset)]) for offset, dst, zone in tzinfos])
    else:
        timezones.append(' '.join([tz, str(timezone(tz)._utcoffset)]))

В соответствии с вашим комментарием относительно удаления часовых поясов со смещениями, которые не попадают где-то на интервале в четверть часа из выходных данных, вы, вероятно, хотите удалить различные часовые пояса, которые включены для исторических дат (часто дат 19-го и начала 20-го века). ) большинство из которых включены в качестве разновидности «среднего времени», например «LMT» для «местного времени». Один из подходов к их устранению - просто отфильтровать все сокращения часовых поясов, заканчивающиеся на «MT», за исключением «GMT». Вероятно, есть несколько других исключений в текущем использовании, о которых я не знаю, но их также следует обрабатывать так же, как «GMT».

timezones = {}
for tz in all_timezones:
    tzinfos = getattr(timezone(tz), '_tzinfos', None)
    if tzinfos:
        timezones[tz] = [(zone, str(offset)) for offset, dst, zone in tzinfos if zone == 'GMT' or not zone.endswith('MT')]
    else:
        timezones[tz] = [(tz, str(timezone(tz)._utcoffset))]

print(timezones)
# {
#     'Africa/Abidjan': [('GMT', '0:00:00')],
#     'Africa/Accra': [('GMT', '0:00:00'), ('+0020', '0:20:00')],
#     'Africa/Addis_Ababa': [('EAT', '3:00:00'), ('+0230', '2:30:00'), ('+0245', '2:45:00')],
#     'Africa/Algiers': [('WET', '0:00:00'), ('WEST', '1:00:00'), ('CET', '1:00:00'), ('CEST', '2:00:00')],
#     'Africa/Asmara': [('EAT', '3:00:00'), ('+0230', '2:30:00'), ('+0245', '2:45:00')],
#     ...
#     }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...