ฉันอยากจะรู้ว่าอะไรคือค่าที่เป็นไปได้ทั้งหมดสำหรับอาร์กิวเมนต์เขตเวลาใน Python library pytz ทำอย่างไร?
ssl.cert_time_to_second() ASN1_TIME_print()
ฉันอยากจะรู้ว่าอะไรคือค่าที่เป็นไปได้ทั้งหมดสำหรับอาร์กิวเมนต์เขตเวลาใน Python library 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
'Asia/Shanghai'ที่มีเขตเวลาชื่อ
(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 มีฟังก์ชันที่คล้ายกัน แต่ใช้ฐานข้อมูลเขตเวลาของระบบปฏิบัติการและไม่มีปัญหาดังกล่าว
อย่าสร้างรายการของคุณเอง - 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://th.wikipedia.org/wiki/List_of_tz_database_time_zones โปรดทราบว่ารายการนี้มีชื่อนามแฝงจำนวนมากเช่น US / Eastern สำหรับเขตเวลาที่เรียกว่า America / New_York
หากคุณต้องการสร้างรายการนี้โดยอัตโนมัติจากฐานข้อมูล zoneinfo คุณสามารถรวบรวมได้จากไฟล์ zone.tab ในฐานข้อมูล zoneinfo ฉันไม่คิดว่า pytz มี API เพื่อให้ได้มาและฉันก็ไม่คิดว่ามันจะมีประโยชน์มาก
ที่นี่รายการ 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
หวังว่าจะช่วย
pytzจัดเตรียมการเข้าถึงฐานข้อมูล tz (เป็นแหล่งข้อมูล wikipedia)
แก้ไข: ฉันจะขอบคุณถ้าคุณไม่ลงคะแนนคำตอบนี้เพิ่มเติม คำตอบนี้ผิดแต่ฉันอยากจะเก็บไว้เป็นบันทึกทางประวัติศาสตร์ แม้ว่าจะสามารถพิสูจน์ได้ว่าอินเทอร์เฟซของ 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
pytzคุณแค่ใช้มันผิด PS นี้ไม่ได้เป็นคำตอบสำหรับคำถามที่ทุกคน
datetimeอินเทอร์เฟซที่ผิดใช่มั้pytzย datetimeไม่คาดหวังวัตถุเขตเวลาอัจฉริยะดังนั้นอินเทอร์เฟซของมันจึงไม่สามารถเริ่มต้นได้อย่างถูกต้อง
datetimeเป็นส่วนหนึ่งของไลบรารี Python มาตรฐานและเป็น pytz ที่ควรทำตามdatetimeส่วนต่อประสานไม่ใช่ในทางกลับกัน หากใครก็ตามสามารถใช้ส่วนต่อประสานในวิธีที่พวกเขาคิดว่าดีขึ้นโดยไม่มีฉันทามติก็จะไม่มีซอฟต์แวร์ที่แข็งแกร่ง
pytzไม่สามารถติดตามdatetimeอินเตอร์เฟสได้เนื่องจากdatetimeอินเทอร์เฟซขาด ผู้เขียนอินเทอร์เฟซนั้นไม่ได้คาดการณ์ปัญหาของเขตเวลาที่พารามิเตอร์เปลี่ยนแปลงตลอดหลายปีที่ผ่านมา เพียงเพราะมันเป็นส่วนหนึ่งของการแจกจ่าย Python มาตรฐานไม่ได้หมายความว่าสมบูรณ์แบบ
ในความคิดของฉันนี่เป็นข้อบกพร่องในการออกแบบของ pytz library ควรมีความน่าเชื่อถือมากกว่าในการระบุเขตเวลาโดยใช้ออฟเซ็ตเช่น
pytz.construct("UTC-07:00")
ซึ่งให้เขตเวลาแคนาดา / แปซิฟิก