Я хотел бы знать, каковы все возможные значения для аргумента часового пояса в библиотеке 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")
который дает вам Канада / Тихоокеанский часовой пояс.