ใช้ timedelta เพื่อสลับระหว่างเขตเวลา สิ่งที่คุณต้องการคือการชดเชยเป็นชั่วโมงระหว่างเขตเวลา ไม่ต้องเล่นแร่แปรธาตุที่มีขอบเขตสำหรับทั้ง 6 องค์ประกอบของวัตถุ datetime timedelta จัดการกับปีอธิกสุรทินหลายศตวรรษและอื่น ๆ ได้อย่างง่ายดาย คุณต้องก่อน
from datetime import datetime, timedelta
ถ้าoffset
เป็นเขตเวลาเดลต้าในหน่วยชั่วโมง:
timeout = timein + timedelta(hours = offset)
โดย timein และ timeout เป็นวัตถุ datetime เช่น
timein + timedelta(hours = -8)
แปลงจาก GMT เป็น PST
ดังนั้นวิธีการตรวจสอบoffset
? นี่คือฟังก์ชั่นที่เรียบง่ายที่ให้คุณมีความเป็นไปได้เพียงไม่กี่อย่างเท่านั้นสำหรับการแปลงโดยไม่ต้องใช้ออบเจ็กต์วันที่และเวลาที่ "รู้" ซึ่งเป็นคำตอบอื่น ๆ คู่มือเล็กน้อย แต่บางครั้งความคมชัดดีที่สุด
def change_timezone(timein, timezone, timezone_out):
'''
changes timezone between predefined timezone offsets to GMT
timein - datetime object
timezone - 'PST', 'PDT', 'GMT' (can add more as needed)
timezone_out - 'PST', 'PDT', 'GMT' (can add more as needed)
'''
# simple table lookup
tz_offset = {'PST': {'GMT': 8, 'PDT': 1, 'PST': 0}, \
'GMT': {'PST': -8, 'PDT': -7, 'GMT': 0}, \
'PDT': {'GMT': 7, 'PST': -1, 'PDT': 0}}
try:
offset = tz_offset[timezone][timezone_out]
except:
msg = 'Input timezone=' + timezone + ' OR output time zone=' + \
timezone_out + ' not recognized'
raise DateTimeError(msg)
return timein + timedelta(hours = offset)
หลังจากดูคำตอบมากมายและเล่นด้วยรหัสที่แคบที่สุดฉันสามารถนึกถึง (ตอนนี้) มันดูดีที่สุดว่าแอปพลิเคชันทั้งหมดที่เวลามีความสำคัญและเขตเวลาแบบผสมจะต้องถูกนำมาใช้ควรใช้ความพยายามอย่างแท้จริง "ตระหนัก" ดูเหมือนว่าคำตอบที่ง่ายที่สุดคือ:
timeout = timein.astimezone(pytz.timezone("GMT"))
เพื่อแปลงเป็น GMT ตัวอย่าง แน่นอนว่าการแปลงเป็น / จากเขตเวลาอื่นที่คุณต้องการไม่ว่าจะเป็นในท้องถิ่นหรืออื่น ๆ เพียงแค่ใช้สตริงเขตเวลาที่เหมาะสมที่ Pytz เข้าใจ (จาก pytz.all_timezones) เวลาออมแสงจะถูกนำมาพิจารณาด้วย