Бих искал да знам какви са всички възможни стойности за аргумента за часова зона в библиотеката на Python pytz. Как да го направим?
Има ли списък с часови зони Pytz?
Отговори (8)
Можете да изброите всички налични часови зони с 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
all_timezones
, pytz предоставя също common_timezones
.
- person Mark Hildreth; 21.05.2013
(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 предоставя подобни функции, но използва базата данни за часовата зона на OS и няма подобни проблеми.
- person Yongwei Wu; 01.02.2018
pytz.country_timezones
. Пример: pytz.country_timezones['us']
Използва ISO 3166 код на държавата за търсене. Връща списък: ['America/New_York', 'America/Detroit', ...]
- person kr85; 15.08.2020
pytz.all_timezones
можете да използвате разбиране на списък: [x for x in pytz.all_timezones if "australia" in x.lower()]
или филтър: list(filter(lambda x: "australia" in x.lower(), pytz.all_timezones))
- person Dylan Hogg; 11.03.2021
Не създавайте свой собствен списък - 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 с кодове на държави, имена, континенти, столици и часови зони на pytz.
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
Надявам се, помага.
РЕДАКТИРАНЕ: Ще съм благодарен, ако повече не гласувате против този отговор. Този отговор е грешен, но бих предпочел да го запазя като историческа бележка. Въпреки че е спорно дали интерфейсът на 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>
РЕДАКТИРАНЕ: Благодарение на коментара на Марк Рансъм и гласуването против, сега знам, че използвам pytz по грешен начин. В обобщение, не трябва да предавате резултата от pytz.timezone(…)
към datetime
, но трябва да предавате datetime
към неговия localize
метод.
Въпреки неговия аргумент (и моето лошо, че не прочетох по-внимателно документацията на pytz), ще запазя този отговор. Отговарях на въпроса по един начин (как да изброя поддържаните часови зони, макар и не с pytz), защото вярвах, че pytz не предоставя правилно решение. Въпреки че вярването ми беше грешно, този отговор все още предоставя известна информация, IMHO, която е потенциално полезна за хората, интересуващи се от този въпрос. Правилният начин на Pytz да прави нещата е контраинтуитивен. По дяволите, ако tzinfo, създадена от pytz, не трябва да се използва директно от datetime
, тя трябва да е от различен тип. Интерфейсът на pytz е просто зле проектиран. Връзката, предоставена от Марк, показва, че много хора, не само аз, са били подведени от интерфейса на pytz.
pytz
, просто го използвате погрешно. P.S. Това изобщо не е отговор на въпроса.
- person Mark Ransom; 01.02.2018
datetime
е грешен, а не pytz
. datetime
не предвиди интелигентни обекти за часова зона, така че интерфейсът му не ги инициализира правилно.
- person Mark Ransom; 02.02.2018
datetime
е част от стандартната библиотека на Python и именно pytz трябва да следва интерфейса datetime
, а не обратното. Ако някой можеше да внедри някакъв интерфейс по начина, по който смята, че е по-добър без консенсус, нямаше да има стабилен софтуер.
- person Yongwei Wu; 02.02.2018
pytz
не може да следва интерфейса datetime
, защото интерфейсът datetime
е недостатъчен. Авторите на този интерфейс не са предвидили проблемите на часовата зона, чиито параметри се променят през годините. Това, че е част от стандартната дистрибуция на Python, не означава, че е перфектен.
- person Mark Ransom; 02.02.2018
pytz.timezone
несъвместим с параметъра tzinfo
от datetime
. По-добре е програмата да спре, отколкото да генерира неправилни резултати.
- person Yongwei Wu; 02.02.2018
Те изглежда са попълнени от часовите зони на базата данни tz, намерени тук.
pytz
осигурява достъп до базата данни tz (това е източникът за данните от wikipedia).
- person jfs; 02.10.2015
Достъпно от Python3.9:
zoneinfo, нов модул в Python3.9, който работи срещу базата данни на IANA. За да вземете всички налични часови зони, първо:
pip install tzdata
И тогава:
import zoneinfo
print(zoneinfo.available_timezones())
По мое мнение това е дефект в дизайна на библиотеката pytz. Трябва да е по-надеждно да посочите часова зона с помощта на отместването, напр.
pytz.construct("UTC-07:00")
което ви дава канадска/тихоокеанска часова зона.