Има ли списък с часови зони Pytz?

Бих искал да знам какви са всички възможни стойности за аргумента за часова зона в библиотеката на Python pytz. Как да го направим?


person ipegasus    schedule 13.12.2012    source източник
comment
Бележка на модератора: Моля, оставете въпроса си като въпрос. Вместо това можете да напишете свое собствено решение в публикация за отговор.   -  person Martijn Pieters    schedule 26.02.2021


Отговори (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
person unutbu    schedule 13.12.2012
comment
В допълнение към all_timezones, pytz предоставя също common_timezones. - person Mark Hildreth; 21.05.2013
comment
защо липсва Китай? - person Adders; 29.08.2017
comment
Китай използва единична часова зона, чието име е 'Asia/Shanghai'. - person unutbu; 29.08.2017
comment
Този израз показва ужасния резултат, който 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 предоставя подобни функции, но използва базата данни за часовата зона на OS и няма подобни проблеми. - person Yongwei Wu; 01.02.2018
comment
@YongweiWu това е грешно използване на API. Не трябва да подавате директно pytz часова зона с нефиксирано utc отместване като аргумент tzinfo. Използвайте метода .localize(), както предлагат документите на pytz. - person jfs; 09.05.2018
comment
@jfs сега знам. Вижте моя отговор по-долу и дискусиите там. - person Yongwei Wu; 10.05.2018
comment
За пълен списък с часови зони за определена държава използвайте pytz.country_timezones. Пример: pytz.country_timezones['us'] Използва ISO 3166 код на държавата за търсене. Връща списък: ['America/New_York', 'America/Detroit', ...] - person kr85; 15.08.2020
comment
Освен това за подмножество от 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
person chribsen    schedule 13.01.2017

Името на часовата зона е единственият надежден начин за определяне на часовата зона.

Можете да намерите списък с имена на часови зони тук: http://en.wikipedia.org/wiki/List_of_tz_database_time_zones Обърнете внимание, че този списък съдържа много псевдоними, като US/Eastern за часовата зона, която правилно се нарича America/New_York.

Ако програмно искате да създадете този списък от базата данни zoneinfo, можете да го компилирате от файла zone.tab в базата данни zoneinfo. Не мисля, че pytz има API, за да ги получи, и също не мисля, че би било много полезно.

person Lennart Regebro    schedule 13.12.2012
comment
Позволяването на хората да избират своята часова зона от списък е доста полезно. Много уебсайтове и инсталатори на Linux вече правят това. - person qris; 09.11.2020

Ето списък на 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

Надявам се, помага.

person Jay Modi    schedule 14.07.2016

РЕДАКТИРАНЕ: Ще съм благодарен, ако повече не гласувате против този отговор. Този отговор е грешен, но бих предпочел да го запазя като историческа бележка. Въпреки че е спорно дали интерфейсът на 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.

person Yongwei Wu    schedule 01.02.2018
comment
Вижте stackoverflow.com/questions/11473721/ за поправка. Няма нищо лошо в pytz, просто го използвате погрешно. P.S. Това изобщо не е отговор на въпроса. - person Mark Ransom; 01.02.2018
comment
@MarkRansom Добра информация и е хубаво да се знае. Аз обаче не приемам аргумента ви. Интерфейсът е проектиран грешно, точка. Това е много контраинтуитивно. - person Yongwei Wu; 02.02.2018
comment
Да, интерфейсът е проектиран грешно. Но интерфейсът datetime е грешен, а не pytz. datetime не предвиди интелигентни обекти за часова зона, така че интерфейсът му не ги инициализира правилно. - person Mark Ransom; 02.02.2018
comment
С уважение, не съм съгласен. datetime е част от стандартната библиотека на Python и именно pytz трябва да следва интерфейса datetime, а не обратното. Ако някой можеше да внедри някакъв интерфейс по начина, по който смята, че е по-добър без консенсус, нямаше да има стабилен софтуер. - person Yongwei Wu; 02.02.2018
comment
Както казах, pytz не може да следва интерфейса datetime, защото интерфейсът datetime е недостатъчен. Авторите на този интерфейс не са предвидили проблемите на часовата зона, чиито параметри се променят през годините. Това, че е част от стандартната дистрибуция на Python, не означава, че е перфектен. - person Mark Ransom; 02.02.2018
comment
Ако стандартният интерфейс е недостатъчен, живейте с него. Не го чупете. Ако pytz наистина трябва да направи нещо специално, направете резултата от pytz.timezone несъвместим с параметъра tzinfo от datetime. По-добре е програмата да спре, отколкото да генерира неправилни резултати. - person Yongwei Wu; 02.02.2018

Те изглежда са попълнени от часовите зони на базата данни tz, намерени тук.

въведете описание на изображението тук

person Chris Redford    schedule 11.11.2014
comment
pytz осигурява достъп до базата данни tz (това е източникът за данните от wikipedia). - person jfs; 02.10.2015

Достъпно от Python3.9:

zoneinfo, нов модул в Python3.9, който работи срещу базата данни на IANA. За да вземете всички налични часови зони, първо:

pip install tzdata

И тогава:

import zoneinfo

print(zoneinfo.available_timezones())
person JimShapedCoding    schedule 07.10.2020

По мое мнение това е дефект в дизайна на библиотеката pytz. Трябва да е по-надеждно да посочите часова зона с помощта на отместването, напр.

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

което ви дава канадска/тихоокеанска часова зона.

person Jinghui Niu    schedule 22.08.2016
comment
Отместванията се променят през годината (обикновено поради лятното часово време), така че това не е същото като това, което обикновено смятаме за часова зона. - person Ryan Hiebert; 21.09.2016
comment
Избраният синтаксис се основава на дефинициите в tzdata. - person Brad Koch; 01.03.2019