[python] Pytz 시간대 목록이 있습니까?

파이썬 라이브러리 pytz에서 시간대 인수에 가능한 모든 값이 무엇인지 알고 싶습니다. 어떻게합니까?



답변

사용 가능한 모든 시간대를 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


답변

자신의 목록을 작성하지 마십시오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
이 목록에는 America / New_York라는 시간대의 US / Eastern과 같은 별칭 이름이 많이 포함되어 있습니다.

프로그래밍 방식으로 zoneinfo 데이터베이스에서이 목록을 만들려면 zoneinfo 데이터베이스의 zone.tab 파일에서이 목록을 컴파일 할 수 있습니다. 나는 pytz가 그것들을 얻는 API를 가지고 있다고 생각하지 않으며, 또한 그것이 매우 유용하다고 생각하지 않습니다.


답변

여기에 파이썬은 국가 코드, 이름, 대륙, 수도 및 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

희망, 도움이됩니다.


답변

여기 에서 찾은 tz 데이터베이스 시간대 로 채워진 것 같습니다 .

여기에 이미지 설명을 입력하십시오


답변

편집 :이 답변을 더 이상 공감하지 않으면 감사하겠습니다. 이 답변은 잘못 되었지만 오히려 역사적 메모로 유지하려고합니다. pytz 인터페이스가 오류가 발생하기 쉬운 지 여부는 논쟁의 여지가 있지만 dateutil.tz가 할 수없는 일, 특히 과거 또는 미래의 일광 절약과 관련하여 할 수있는 일을 할 수 있습니다. 나는 “Python의 표준 시간대” 기사에서 나의 경험을 솔직하게 기록했다 .


유닉스 계열의 플랫폼이라면 pytz를 피하고 / usr / share / zoneinfo를 참조하십시오. dateutil.tz는이 정보를 활용할 수 있습니다.

다음 코드는 pytz가 줄 수있는 문제를 보여줍니다. 처음 발견했을 때 충격을 받았습니다. 흥미롭게도 CentOS 7에 yum이 설치 한 pytz는이 문제를 나타내지 않습니다.

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가 만든 표준 시간대는 사람들이 관찰하는 표준 현지 시간이 아닌 실제 현지 시간입니다. 상하이는 pytz가 제안한 +0806이 아닌 +0800을 준수합니다.

pytz.timezone('Asia/Shanghai')
<DstTzInfo 'Asia/Shanghai' LMT+8:06:00 STD>

편집 : Mark Ransom의 의견과 downvote 덕분에 이제는 pytz를 잘못 사용하고 있음을 알고 있습니다. 요약하면, 당신은 결과를 전달 안된다 pytz.timezone(…)datetime있지만,을 통과해야 datetime그에게 localize방법.

그의 주장에도 불구하고 (pytz 문서를 더 신중하게 읽지 않는 것은 좋지 않습니다), 나는이 대답을 유지할 것입니다. pytz가 올바른 솔루션을 제공하지 않는다고 생각했기 때문에 한 가지 방법으로 질문에 대답했습니다 (pytz가 아닌 지원되는 시간대를 열거하는 방법). 내 믿음은 틀렸지 만,이 답변은 여전히이 질문에 관심이있는 사람들에게 유용한 정보 인 IMHO를 제공하고 있습니다. Pytz의 올바른 작업 방식은 반 직관적입니다. 경우 생성 하, tzinfo pytz 만든이 직접적으로 사용되어서는 안 datetime, 그것은 다른 타입이어야한다. pytz 인터페이스는 단순히 잘못 설계되었습니다. Mark가 제공하는 링크는 나뿐만 아니라 많은 사람들이 pytz 인터페이스에 의해 잘못 인도되었음을 보여줍니다.


답변

내 생각에 이것은 pytz 라이브러리의 디자인 결함입니다. 오프셋을 사용하여 시간대를 지정하는 것이 더 안정적이어야합니다. 예 :

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

캐나다 / 태평양 시간대를 제공합니다.