Как я могу получить удобочитаемое имя часового пояса в Python? - PullRequest
10 голосов
/ 16 августа 2010

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

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

Ответы [ 5 ]

9 голосов
/ 16 августа 2010

Следующее генерирует defaultdict, отображающий смещения часового пояса (например, «-0400») и сокращения (например, «EDT») для общих географических названий часовых поясов (например, «America / New_York»).

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 дней в году.

9 голосов
/ 16 августа 2010

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

5 голосов
/ 29 января 2016

Мне бы хотелось, чтобы я мог получить «читабельное» имя часового пояса в форме 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, соответствующее вашему местному часовому поясу.

4 голосов
/ 30 июля 2012

Если вы хотите буквально только то, что вы просили, «имя часового пояса в форме 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 , упомянутым Амбер, но для меня не очевидно, как ...

1 голос
/ 16 августа 2010

Проверить 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'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...