Я хотел бы знать, каковы все возможные значения для аргумента часового пояса в библиотеке Python Pytz. Как это сделать?
ssl.cert_time_to_second() ASN1_TIME_print()
Я хотел бы знать, каковы все возможные значения для аргумента часового пояса в библиотеке Python Pytz. Как это сделать?
ssl.cert_time_to_second() ASN1_TIME_print()
Ответы:
Вы можете перечислить все доступные часовые пояса с pytz.all_timezones:
In [40]: import pytz
In [41]: pytz.all_timezones
Out[42]:
['Africa/Abidjan',
'Africa/Accra',
'Africa/Addis_Ababa',
...]
Также есть pytz.common_timezones:
In [45]: len(pytz.common_timezones)
Out[45]: 403
In [46]: len(pytz.all_timezones)
Out[46]: 563
'Asia/Shanghai'.
(datetime(2017,2,13,14,29,29, tzinfo=pytz.timezone('Asia/Shanghai')) - datetime(2017,2,13,14,29,29, tzinfo=pytz.timezone('UTC'))).total_seconds()(результат не -28800). Я буду избегать pytz—dateutil.tz предоставляет аналогичные функции, но использует базу данных часового пояса ОС и не имеет таких проблем.
Не создавайте свой собственный список - pytzимеет встроенный набор:
import pytz
set(pytz.all_timezones_set)
>>> {'Europe/Vienna', 'America/New_York', 'America/Argentina/Salta',..}
Затем вы можете применить часовой пояс :
import datetime
tz = pytz.timezone('Pacific/Johnston')
ct = datetime.datetime.now(tz=tz)
>>> ct.isoformat()
2017-01-13T11:29:22.601991-05:00
Или, если у вас уже есть datetimeобъект, который знает TZ (не наивный):
# This timestamp is in UTC
my_ct = datetime.datetime.now(tz=pytz.UTC)
# Now convert it to another timezone
new_ct = my_ct.astimezone(tz)
>>> new_ct.isoformat()
2017-01-13T11:29:22.601991-05:00
Название часового пояса - единственный надежный способ указать часовой пояс.
Вы можете найти список названий часовых поясов здесь: http://en.wikipedia.org/wiki/List_of_tz_database_time_zones Обратите внимание, что этот список содержит много псевдонимов, например, US / Eastern для часового пояса, который правильно называется America / New_York.
Если вы программно хотите создать этот список из базы данных zoneinfo, вы можете скомпилировать его из файла zone.tab в базе данных zoneinfo. Я не думаю, что у pytz есть API для их получения, и я также не думаю, что это было бы очень полезно.
Здесь представлен список кодов стран, имен, континентов, столиц и часовых поясов Python.
countries = [
{'timezones': ['Europe/Paris'], 'code': 'FR', 'continent': 'Europe', 'name': 'France', 'capital': 'Paris'}
{'timezones': ['Africa/Kampala'], 'code': 'UG', 'continent': 'Africa', 'name': 'Uganda', 'capital': 'Kampala'},
{'timezones': ['Asia/Colombo'], 'code': 'LK', 'continent': 'Asia', 'name': 'Sri Lanka', 'capital': 'Sri Jayewardenepura Kotte'},
{'timezones': ['Asia/Riyadh'], 'code': 'SA', 'continent': 'Asia', 'name': 'Saudi Arabia', 'capital': 'Riyadh'},
{'timezones': ['Africa/Luanda'], 'code': 'AO', 'continent': 'Africa', 'name': 'Angola', 'capital': 'Luanda'},
{'timezones': ['Europe/Vienna'], 'code': 'AT', 'continent': 'Europe', 'name': 'Austria', 'capital': 'Vienna'},
{'timezones': ['Asia/Calcutta'], 'code': 'IN', 'continent': 'Asia', 'name': 'India', 'capital': 'New Delhi'},
{'timezones': ['Asia/Dubai'], 'code': 'AE', 'continent': 'Asia', 'name': 'United Arab Emirates', 'capital': 'Abu Dhabi'},
{'timezones': ['Europe/London'], 'code': 'GB', 'continent': 'Europe', 'name': 'United Kingdom', 'capital': 'London'},
]
Для полного списка: Gist Github
Надеюсь, поможет.
Похоже, они заполнены часовыми поясами базы данных tz, найденными здесь .

pytzобеспечивает доступ к базе данных tz (это источник данных Википедии).
РЕДАКТИРОВАТЬ: Я был бы признателен, если вы не понизить этот ответ дальше. Этот ответ неверный , но я бы предпочел оставить его в качестве исторической заметки. Хотя можно утверждать, что интерфейс pytz подвержен ошибкам, он может делать то, чего не может делать dateutil.tz, особенно в отношении перехода на летнее время в прошлом или в будущем. Я честно записал свой опыт в статье «Часовые пояса в Python» .
Если вы работаете на Unix-подобной платформе, я бы посоветовал вам избегать pytz и просто посмотрите на / usr / share / zoneinfo. dateutil.tz может использовать информацию там.
Следующий фрагмент кода показывает проблему, которую может дать pytz. Я был шокирован, когда впервые узнал об этом. (Интересно, что pytz, установленный yum на CentOS 7, не имеет этой проблемы.)
import pytz
import dateutil.tz
from datetime import datetime
print((datetime(2017,2,13,14,29,29, tzinfo=pytz.timezone('Asia/Shanghai'))
- datetime(2017,2,13,14,29,29, tzinfo=pytz.timezone('UTC')))
.total_seconds())
print((datetime(2017,2,13,14,29,29, tzinfo=dateutil.tz.gettz('Asia/Shanghai'))
- datetime(2017,2,13,14,29,29, tzinfo=dateutil.tz.tzutc()))
.total_seconds())
-29160.0
-28800.0
Т.е. часовой пояс, созданный pytz, соответствует истинному местному времени, а не стандартному местному времени, которое люди наблюдают. Шанхай соответствует +0800, а не +0806, как предполагает pytz:
pytz.timezone('Asia/Shanghai')
<DstTzInfo 'Asia/Shanghai' LMT+8:06:00 STD>
РЕДАКТИРОВАТЬ: Благодаря комментарию Марка Рэнсома и downvote, теперь я знаю, что я использую pytz неправильно. Таким образом, вы не должны передавать результат pytz.timezone(…)в datetime, но должны передавать datetimeего localizeметод.
Несмотря на его аргумент (и мое плохое за то, что я не читаю документацию pytz более внимательно), я собираюсь сохранить этот ответ. Я отвечал на вопрос одним способом (как перечислить поддерживаемые часовые пояса, хотя и не с помощью pytz), потому что я полагал, что pytz не дал правильного решения. Хотя мое мнение было неверным, этот ответ по-прежнему предоставляет некоторую информацию, ИМХО, которая потенциально полезна для людей, заинтересованных в этом вопросе. Правильный способ Pytz делать вещи нелогично . Черт, если tzinfo, созданная pytz , не должна использоваться напрямую datetime, это должен быть другой тип. Интерфейс pytz просто плохо разработан. Ссылка, предоставленная Марком, показывает, что многие люди, не только я, были введены в заблуждение интерфейсом pytz.
pytz, вы просто используете это неправильно. PS Это не ответ на вопрос вообще .
datetimeинтерфейс, который не так, не так pytz. datetimeне ожидал интеллектуальных объектов часового пояса, поэтому его интерфейс не инициализирует их должным образом.
datetimeявляется частью стандартной библиотеки Python, и именно pytz должен следовать datetimeинтерфейсу, а не наоборот. Если бы кто-то мог реализовать какой-либо интерфейс так, как он думает лучше, без консенсуса, не было бы надежного программного обеспечения.
pytzне может следовать datetimeинтерфейсу, потому что datetimeинтерфейс неисправен. Авторы этого интерфейса не предвидели проблем с часовым поясом, параметры которого менялись с годами. Тот факт, что он является частью стандартного дистрибутива Python, не означает, что он идеален.
На мой взгляд, это недостаток дизайна библиотеки Pytz. Надежнее указывать часовой пояс, используя смещение, например
pytz.construct("UTC-07:00")
который дает вам Канада / Тихоокеанский часовой пояс.