Как я могу получить человеко-читаемое имя часового пояса в Python?

В проекте Python, над которым я работаю, я хотел бы получить пользовательское имя часового пояса формы America / New_York , соответствующее локальному часовому поясу системы, для отображения пользователю. Каждый фрагмент кода, который я видел, который обращается к информации о часовом поясе, возвращает только числовое смещение (-0400) или буквенный код (EDT), а иногда и то и другое. Есть ли какая-нибудь библиотека Python, которая может получить доступ к этой информации, или если это не так, преобразовать смещенный / буквенный код в удобочитаемое имя?

Если для определенного часового пояса имеется более одного человека, которое можно прочитать, либо список возможных результатов, либо любой из них является прекрасным, и если нет человеческого удобочитаемого имени, соответствующего текущему часовому поясу, я возьму либо исключение, либо None или [] или что-то еще.

  • Как конвертировать datetime.time из UTC в другой часовой пояс?
  • Получить часовой пояс, используемый datetime.datetime.fromtimestamp ()
  • python: datetime tzinfo время именная документация
  • PYTZ 'Америка / Эдмонтон' смещается неправильно
  • Python strptime () и часовые пояса?
  • Python - простейший и самый последовательный способ получить текущее время, соответствующее времени в UTC?
  • Запись в Python: как установить время на GMT
  • Преобразование часового пояса Python
  • 5 Solutions collect form web for “Как я могу получить человеко-читаемое имя часового пояса в Python?”

    http://pytz.sourceforge.net/ может помочь. Если ничего другого, вы можете получить список всех часовых поясов, а затем перебрать их до тех пор, пока не найдете тот, который соответствует вашему смещению.

    Следующее генерирует смещения временной шкалы по умолчанию (например, '-0400') и сокращения (например, «EDT») для общих географических названий часовых поясов (например, «Америка / Нью-Йорк»).

     import os import dateutil.tz as dtz import pytz import datetime as dt import collections result=collections.defaultdict(list) for name in pytz.common_timezones: timezone=dtz.gettz(name) now=dt.datetime.now(timezone) offset=now.strftime('%z') abbrev=now.strftime('%Z') result[offset].append(name) result[abbrev].append(name) print(result) 

    Обратите внимание, что сокращения в часовом поясе могут иметь совершенно разные значения . Например, «EST» может выступать в Восточном летнем времени (UTC + 10) в Австралии или в Восточном стандартном времени (UTC-5) в Северной Америке.

    Кроме того, смещения и аббревиатуры могут изменяться для регионов, которые используют стандартное время дневного света. Таким образом, сохранение статического dict не может обеспечить правильное имя часового пояса 365 дней в году.

    Если вы хотите только буквально то, что вы просили, «имя часового пояса формы America / New_York, соответствующее системному локальному часовому поясу», и если вы только заботитесь о Linux (и тому подобное), то это должно выполнить эту задачу:

     import os import os.path import sys def main(argv): tzname = os.environ.get('TZ') if tzname: print tzname elif os.path.exists('/etc/timezone'): print file('/etc/timezone').read() else: sys.exit(1) if __name__ == '__main__': main(sys.argv) 

    Конечно, было бы лучше иметь библиотеку, которая инкапсулирует это более чистым способом и, возможно, обрабатывает другие случаи, которые вы упоминаете в комментариях, например, уже имеющих объект tzinfo . Я думаю, вы можете сделать это с помощью pytz, упомянутого Amber, но для меня это не очевидно, как …

    Я бы хотел получить «пользовательское» имя часового пояса формы America / New_York, соответствующее местному часовому поясу системы, для отображения пользователю.

    Существует модуль tzlocal который возвращает объект pytz tzinfo, соответствующий локальному часовому поясу системы:

     #!/usr/bin/env python import tzlocal # $ pip install tzlocal print(tzlocal.get_localzone().zone) # display "human-readable" name (tzid) # -> Europe/Moscow 

    Чтобы ответить на вопрос в заголовке (для людей из Google), вы можете использовать %Z%z для печати локальной информации о часовом поясе:

     #!/usr/bin/env python import time print(time.strftime('%Z%z')) # -> MSK+0300 

    Он печатает текущую временную сокращенную аббревиатуру и смещение utc, соответствующее вашему местному часовому поясу.

    Проверьте python-dateutil

     py> from dateutil.tz import * py> ny = gettz('America/New York') py> ny._filename '/usr/share/zoneinfo/America/New_York' py> ny._filename.split('/', 4)[-1] 'America/New_York' 
    Python - лучший язык программирования в мире.