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


659

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


6
"GMT", "GMT + 0", "GMT-0", "GMT0", "Greenwich", "UCT", "UTC", "Universal"및 "Zulu"가 기본적으로 동일한 의미를 갖는 방식이 재미 있고 그러나 많은 항목이 있습니다.
Joe Z.

42
GMT는 UTC와 다릅니다. 일반적인 실수입니다.
PawelRoman

1
@PawelRoman : GMT는 다른 상황에서 다른 것을 의미 할 수 있습니다. 그것은 않습니다 때때로 예를 들어 평균 UTC를, 같은 인정과 같은 SSL 인증서 시간 문자열이 필요 GMT ( 레거시). ssl.cert_time_to_second() ASN1_TIME_print()
jfs

3
@PawelRoman 하나는 시간대이고 다른 하나는 표준이라는 점에서 옳습니다. 그러나 대부분의 사람들이 생각하는 실질적인 의미에서, 둘 다 같은 시간을 의미합니다.
rob

답변:


318

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

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는 비슷한 기능을 제공하지만 OS 시간대 데이터베이스를 사용하며 그러한 문제는 없습니다.
Yongwei Wu

2
@ YongweiWu 잘못된 API 사용법입니다. 고정되지 않은 utc 오프셋을 가진 pytz 시간대를 tzinfo 인수로 직접 전달해서는 안됩니다. pytz 문서에서 제안한대로 .localize () 메서드를 사용하십시오.
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

27

시간대 이름은 시간대를 지정하는 유일한 신뢰할 수있는 방법입니다.

시간대 이름 목록은 여기에서 찾을 수 있습니다. http://en.wikipedia.org/wiki/List_of_tz_database_time_zones 이 목록에는 America / New_York라는 시간대의 US / Eastern과 같은 별칭 이름이 많이 포함되어 있습니다.

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


14

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

희망, 도움이됩니다.



4

편집 :이 답변을 더 이상 공감하지 않으면 감사하겠습니다. 이 답변은 잘못 되었지만 오히려 역사적 메모로 유지하려고합니다. 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 인터페이스에 의해 잘못 인도되었음을 보여줍니다.


2
수정 사항 은 stackoverflow.com/questions/11473721/… 를 참조하십시오 . 에 아무런 문제가 없습니다. 잘못 pytz사용하고 있습니다. 추신 : 이것은 전혀 질문 대한 답변이 아닙니다 .
Mark Ransom

1
@MarkRansom 좋은 정보입니다. 그러나 나는 당신의 주장을 사지 않습니다. 인터페이스가 잘못 설계되었습니다. 매우 반 직관적입니다.
Yongwei Wu

3
예, 인터페이스가 잘못 설계되었습니다. 그러나 datetime인터페이스가 잘못되었습니다 pytz. 지능형 시간대 개체를 datetime예상하지 않았 으므로 인터페이스가 제대로 초기화되지 않았습니다.
마크 랜섬

1
나는 동의하지 않습니다. datetime표준 Python 라이브러리의 일부이며 datetime인터페이스가 아닌 그 반대로 따라야하는 pytz입니다 . 아무도 합의없이 더 나은 사고 방식으로 인터페이스를 구현할 수 있다면 강력한 소프트웨어는 없을 것입니다.
Yongwei Wu

2
내가 말했듯 이 인터페이스가 부족 하기 때문에 인터페이스를 pytz따를 수 없습니다 . 이 인터페이스의 저자는 수년에 걸쳐 매개 변수가 변경되는 시간대의 문제를 예상하지 못했습니다. 그것이 표준 파이썬 배포판의 일부이기 때문에 그것이 완벽하다는 것을 의미하지는 않습니다. datetimedatetime
마크 랜섬

-8

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

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

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


12
오프셋은 1 년 내내 (일반적으로 일광 절약 시간으로 인해) 변경되므로 일반적으로 표준 시간대로 생각하는 것과 다릅니다.
Ryan Hiebert

선택된 구문은 tzdata 의 정의를 기반으로합니다 .
Brad Koch
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.