มีรายการของ Pytz Timezones หรือไม่?


659

ฉันอยากจะรู้ว่าอะไรคือค่าที่เป็นไปได้ทั้งหมดสำหรับอาร์กิวเมนต์เขตเวลาใน Python library 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 คุณถูกต้องในแง่หนึ่งว่าเป็นเขตเวลาและอีกอันเป็นมาตรฐาน แต่ในความเป็นจริงแล้วคนส่วนใหญ่คิดว่าทั้งคู่อ้างถึงช่วงเวลาเดียวกันในเวลาเดียวกัน
ปล้น

คำตอบ:


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นอกจากนี้ยังมี
Mark Hildreth

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) ฉันจะหลีกเลี่ยง pytzdateutil.tz มีฟังก์ชันที่คล้ายกัน แต่ใช้ฐานข้อมูลเขตเวลาของระบบปฏิบัติการและไม่มีปัญหาดังกล่าว
Yongwei Wu

2
@ YongweiWu เป็นการใช้ API ที่ผิด คุณไม่ควรส่งเขตเวลาของ pytz ด้วยอ็อฟเซ็ต utc ที่ไม่คงที่เป็นอาร์กิวเมนต์ tzinfo โดยตรง ใช้. localize () วิธีการเป็นเอกสาร pytz แนะนำ
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://th.wikipedia.org/wiki/List_of_tz_database_time_zones โปรดทราบว่ารายการนี้มีชื่อนามแฝงจำนวนมากเช่น US / Eastern สำหรับเขตเวลาที่เรียกว่า America / New_York

หากคุณต้องการสร้างรายการนี้โดยอัตโนมัติจากฐานข้อมูล zoneinfo คุณสามารถรวบรวมได้จากไฟล์ zone.tab ในฐานข้อมูล zoneinfo ฉันไม่คิดว่า pytz มี API เพื่อให้ได้มาและฉันก็ไม่คิดว่ามันจะมีประโยชน์มาก


14

ที่นี่รายการ 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'},
]

สำหรับรายการทั้งหมด: สรุปสาระสำคัญ Github

หวังว่าจะช่วย



4

แก้ไข: ฉันจะขอบคุณถ้าคุณไม่ลงคะแนนคำตอบนี้เพิ่มเติม คำตอบนี้ผิดแต่ฉันอยากจะเก็บไว้เป็นบันทึกทางประวัติศาสตร์ แม้ว่าจะสามารถพิสูจน์ได้ว่าอินเทอร์เฟซของ 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>

แก้ไข:ขอบคุณความคิดเห็นของ Mark Ransom และ downvote ตอนนี้ฉันรู้ว่าฉันใช้ pytz ผิดทาง โดยสรุปคุณไม่ควรส่งผลลัพธ์pytz.timezone(…)ถึงdatetimeแต่ควรส่งผ่านdatetimeไปยังlocalizeวิธีการ

แม้จะมีข้อโต้แย้งของเขา (และของฉันไม่ดีสำหรับการไม่อ่านเอกสาร pytz อย่างรอบคอบมากขึ้น) ฉันจะเก็บคำตอบนี้ไว้ ฉันกำลังตอบคำถามด้วยวิธีหนึ่ง (วิธีการระบุเขตเวลาที่สนับสนุนแม้ว่าจะไม่ใช่กับ pytz) เพราะฉันเชื่อว่า pytz ไม่ได้ให้วิธีแก้ไขที่ถูกต้อง แม้ว่าความเชื่อของฉันจะผิด แต่คำตอบนี้ยังคงให้ข้อมูลบางอย่าง แต่ IMHO ซึ่งอาจเป็นประโยชน์ต่อผู้ที่สนใจคำถามนี้ วิธีที่ถูกต้องของ Pytz ในการทำสิ่งต่าง ๆ นั้นเป็นเรื่องง่าย Heck ถ้าtzinfo ที่สร้างโดย pytz ไม่ควรใช้โดยตรงdatetimeมันควรเป็นประเภทที่แตกต่างกัน ส่วนต่อประสาน pytz นั้นออกแบบมาไม่ดี ลิงก์ที่มาร์คจัดทำขึ้นแสดงให้เห็นว่ามีหลายคนที่ไม่ใช่แค่ฉันถูกเข้าใจผิดโดยอินเทอร์เฟซของ pytz


2
ดูstackoverflow.com/questions/11473721/…สำหรับการแก้ไข ไม่มีอะไรผิดปกติpytzคุณแค่ใช้มันผิด PS นี้ไม่ได้เป็นคำตอบสำหรับคำถามที่ทุกคน
Mark Ransom

1
@ MarkRansom ข้อมูลที่ดีและมันเป็นเรื่องดีที่จะรู้ อย่างไรก็ตามฉันไม่ซื้ออาร์กิวเมนต์ของคุณ อินเทอร์เฟซถูกออกแบบมาผิดระยะเวลา มันใช้งานง่ายมาก
Yongwei Wu

3
ใช่อินเตอร์เฟสได้รับการออกแบบมาไม่ถูกต้อง แต่มันเป็นdatetimeอินเทอร์เฟซที่ผิดใช่มั้pytzdatetimeไม่คาดหวังวัตถุเขตเวลาอัจฉริยะดังนั้นอินเทอร์เฟซของมันจึงไม่สามารถเริ่มต้นได้อย่างถูกต้อง
Mark Ransom

1
ด้วยความเคารพฉันไม่เห็นด้วย datetimeเป็นส่วนหนึ่งของไลบรารี Python มาตรฐานและเป็น pytz ที่ควรทำตามdatetimeส่วนต่อประสานไม่ใช่ในทางกลับกัน หากใครก็ตามสามารถใช้ส่วนต่อประสานในวิธีที่พวกเขาคิดว่าดีขึ้นโดยไม่มีฉันทามติก็จะไม่มีซอฟต์แวร์ที่แข็งแกร่ง
Yongwei Wu

2
อย่างที่ฉันบอกว่าpytzไม่สามารถติดตามdatetimeอินเตอร์เฟสได้เนื่องจากdatetimeอินเทอร์เฟซขาด ผู้เขียนอินเทอร์เฟซนั้นไม่ได้คาดการณ์ปัญหาของเขตเวลาที่พารามิเตอร์เปลี่ยนแปลงตลอดหลายปีที่ผ่านมา เพียงเพราะมันเป็นส่วนหนึ่งของการแจกจ่าย Python มาตรฐานไม่ได้หมายความว่าสมบูรณ์แบบ
Mark Ransom

-8

ในความคิดของฉันนี่เป็นข้อบกพร่องในการออกแบบของ pytz library ควรมีความน่าเชื่อถือมากกว่าในการระบุเขตเวลาโดยใช้ออฟเซ็ตเช่น

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

ซึ่งให้เขตเวลาแคนาดา / แปซิฟิก


12
การเปลี่ยนแปลงออฟเซ็ตตลอดทั้งปี (โดยปกติจะเป็นเพราะการปรับเวลาตามฤดูกาล) ดังนั้นจึงไม่เหมือนกับที่เราคิดว่าเป็นเขตเวลา
Ryan Hiebert

ไวยากรณ์ได้รับการแต่งตั้งขึ้นอยู่กับคำจำกัดความในtzdata
แบรดโคช์
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.