Есть ли список часовых поясов Pytz?

660

Я хотел бы знать, каковы все возможные значения для аргумента часового пояса в библиотеке Python Pytz. Как это сделать?

ipegasus
источник
6
Забавно, что «GMT», «GMT + 0», «GMT-0», «GMT0», «Гринвич», «UCT», «UTC», «Universal» и «Zulu» означают в основном одно и то же и все же есть так много записей для этого.
Джо З.
43
GMT не совпадает с UTC. Это распространенная ошибка.
PawelRoman
1
@PawelRoman: GMT может означать разные вещи в другом контексте. Это делает средний UTC иногда , например, SSL - сертификат времени строки , такие как принято требует GMT ( наследство). ssl.cert_time_to_second() ASN1_TIME_print()
JFS
3
@PawelRoman вы правы в том смысле, что один является часовым поясом, а другой - стандартом. Но в практическом смысле, о котором думают большинство людей, оба ссылаются на один и тот же момент времени.
ограбить
1
@YongweiWu см stackoverflow.com/questions/11473721/...
Марк Ransom

Ответы:

319

Вы можете перечислить все доступные часовые пояса с 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
unutbu
источник
9
В дополнение к all_timezones, Pytz также обеспечивает common_timezones .
Марк Хилдрет
3
почему пропал Китай?
Adders
4
Китай использует один часовой пояс, название которого называется часовой пояс 'Asia/Shanghai'.
unutbu
1
Это выражение показывает ужасный результат, который может дать pytz : (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 предоставляет аналогичные функции, но использует базу данных часового пояса ОС и не имеет таких проблем.
Yongwei Wu
2
@YongweiWu это неправильное использование API. Вы не должны напрямую передавать часовой пояс pytz с нефиксированным смещением utc в качестве аргумента tzinfo. Используйте метод .localize (), как предполагает документация pytz.
JFS
38

Не создавайте свой собственный список - 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
chribsen
источник
27

Название часового пояса - единственный надежный способ указать часовой пояс.

Вы можете найти список названий часовых поясов здесь: http://en.wikipedia.org/wiki/List_of_tz_database_time_zones Обратите внимание, что этот список содержит много псевдонимов, например, US / Eastern для часового пояса, который правильно называется America / New_York.

Если вы программно хотите создать этот список из базы данных zoneinfo, вы можете скомпилировать его из файла zone.tab в базе данных zoneinfo. Я не думаю, что у pytz есть API для их получения, и я также не думаю, что это было бы очень полезно.

Леннарт Регебро
источник
14

Здесь представлен список кодов стран, имен, континентов, столиц и часовых поясов 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

Надеюсь, поможет.

Джей Моди
источник
4

Похоже, они заполнены часовыми поясами базы данных tz, найденными здесь .

введите описание изображения здесь

Крис Редфорд
источник
1
pytzобеспечивает доступ к базе данных tz (это источник данных Википедии).
Jfs
4

РЕДАКТИРОВАТЬ: Я был бы признателен, если вы не понизить этот ответ дальше. Этот ответ неверный , но я бы предпочел оставить его в качестве исторической заметки. Хотя можно утверждать, что интерфейс 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.

Юнвэй Ву
источник
2
См. Stackoverflow.com/questions/11473721/… для исправления. Там нет ничего плохого pytz, вы просто используете это неправильно. PS Это не ответ на вопрос вообще .
Марк Рэнсом
1
@MarkRansom Хорошая информация, и это приятно знать. Тем не менее, я не покупаю ваш аргумент. Интерфейс разработан неправильно, точка. Это очень нелогично.
Yongwei Wu
3
Да, интерфейс спроектирован неправильно. Но это datetimeинтерфейс, который не так, не так pytz. datetimeне ожидал интеллектуальных объектов часового пояса, поэтому его интерфейс не инициализирует их должным образом.
Марк Рэнсом
1
С уважением я не согласен. datetimeявляется частью стандартной библиотеки Python, и именно pytz должен следовать datetimeинтерфейсу, а не наоборот. Если бы кто-то мог реализовать какой-либо интерфейс так, как он думает лучше, без консенсуса, не было бы надежного программного обеспечения.
Юнвэй Ву
2
Как я уже сказал, pytzне может следовать datetimeинтерфейсу, потому что datetimeинтерфейс неисправен. Авторы этого интерфейса не предвидели проблем с часовым поясом, параметры которого менялись с годами. Тот факт, что он является частью стандартного дистрибутива Python, не означает, что он идеален.
Марк Рэнсом
-8

На мой взгляд, это недостаток дизайна библиотеки Pytz. Надежнее указывать часовой пояс, используя смещение, например

pytz.construct("UTC-07:00")

который дает вам Канада / Тихоокеанский часовой пояс.

Цзинхуэй Ниу
источник
12
Смещения меняются в течение года (обычно из-за перехода на летнее время), поэтому это не то же самое, что мы обычно называем часовым поясом.
Райан Хиберт
Выбранный синтаксис основан на определениях в tzdata .
Брэд Кох