파이썬 라이브러리 pytz에서 시간대 인수에 가능한 모든 값이 무엇인지 알고 싶습니다. 어떻게합니까?
ssl.cert_time_to_second()
ASN1_TIME_print()
파이썬 라이브러리 pytz에서 시간대 인수에 가능한 모든 값이 무엇인지 알고 싶습니다. 어떻게합니까?
ssl.cert_time_to_second()
ASN1_TIME_print()
답변:
사용 가능한 모든 시간대를 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
(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 시간대 데이터베이스를 사용하며 그러한 문제는 없습니다.
자신의 목록을 작성하지 마십시오 - 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
희망, 도움이됩니다.
편집 :이 답변을 더 이상 공감하지 않으면 감사하겠습니다. 이 답변은 잘못 되었지만 오히려 역사적 메모로 유지하려고합니다. 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
사용하고 있습니다. 추신 : 이것은 전혀 질문 에 대한 답변이 아닙니다 .
datetime
인터페이스가 잘못되었습니다 pytz
. 지능형 시간대 개체를 datetime
예상하지 않았 으므로 인터페이스가 제대로 초기화되지 않았습니다.
datetime
표준 Python 라이브러리의 일부이며 datetime
인터페이스가 아닌 그 반대로 따라야하는 pytz입니다 . 아무도 합의없이 더 나은 사고 방식으로 인터페이스를 구현할 수 있다면 강력한 소프트웨어는 없을 것입니다.
pytz
따를 수 없습니다 . 이 인터페이스의 저자는 수년에 걸쳐 매개 변수가 변경되는 시간대의 문제를 예상하지 못했습니다. 그것이 표준 파이썬 배포판의 일부이기 때문에 그것이 완벽하다는 것을 의미하지는 않습니다. datetime
datetime
내 생각에 이것은 pytz 라이브러리의 디자인 결함입니다. 오프셋을 사용하여 시간대를 지정하는 것이 더 안정적이어야합니다. 예 :
pytz.construct("UTC-07:00")
캐나다 / 태평양 시간대를 제공합니다.