ฉันอยากจะรู้ว่าอะไรคือค่าที่เป็นไปได้ทั้งหมดสำหรับอาร์กิวเมนต์เขตเวลาใน 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")
ซึ่งให้เขตเวลาแคนาดา / แปซิฟิก