ฉันต้องทำอะไร
ฉันมีวัตถุ datetime ที่ไม่ทราบเขตเวลาซึ่งฉันต้องเพิ่มเขตเวลาเพื่อที่จะสามารถเปรียบเทียบกับวัตถุ datetime ที่รับรู้เขตเวลาอื่นได้ ฉันไม่ต้องการแปลงแอปพลิเคชันทั้งหมดของฉันเป็นเขตเวลาโดยไม่รู้ตัวสำหรับกรณีแบบดั้งเดิมนี้
สิ่งที่ฉันได้ลอง
ก่อนอื่นเพื่อแสดงปัญหา:
Python 2.6.1 (r261:67515, Jun 24 2010, 21:47:49)
[GCC 4.2.1 (Apple Inc. build 5646)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import datetime
>>> import pytz
>>> unaware = datetime.datetime(2011,8,15,8,15,12,0)
>>> unaware
datetime.datetime(2011, 8, 15, 8, 15, 12)
>>> aware = datetime.datetime(2011,8,15,8,15,12,0,pytz.UTC)
>>> aware
datetime.datetime(2011, 8, 15, 8, 15, 12, tzinfo=<UTC>)
>>> aware == unaware
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: can't compare offset-naive and offset-aware datetimes
ก่อนอื่นฉันลอง astimezone:
>>> unaware.astimezone(pytz.UTC)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: astimezone() cannot be applied to a naive datetime
>>>
ไม่น่าแปลกใจเลยที่ความล้มเหลวนี้เกิดขึ้นเนื่องจากเป็นความพยายามในการทำ Conversion แทนที่ดูเหมือนจะเป็นทางเลือกที่ดีกว่า (ตามPython: วิธีรับค่าของ datetime.today () นั่นคือ "เขตเวลาตระหนัก"? ):
>>> unaware.replace(tzinfo=pytz.UTC)
datetime.datetime(2011, 8, 15, 8, 15, 12, tzinfo=<UTC>)
>>> unaware == aware
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: can't compare offset-naive and offset-aware datetimes
>>>
แต่อย่างที่คุณเห็นแทนที่ดูเหมือนจะตั้งค่า tzinfo แต่ไม่ทำให้วัตถุทราบ ฉันพร้อมที่จะถอยกลับไปหาหมอสายป้อนให้มีเขตเวลาก่อนที่จะแยกมัน (ฉันใช้ dateutil สำหรับการแยกถ้าเรื่อง) แต่ที่ดูเหมือนว่าไร้สาระอย่างไม่น่าเชื่อ
นอกจากนี้ฉันได้ลองใน python 2.6 และ python 2.7 ด้วยผลลัพธ์เดียวกัน
บริบท
ฉันกำลังเขียนโปรแกรมแยกวิเคราะห์สำหรับไฟล์ข้อมูลบางไฟล์ มีรูปแบบเก่าที่ฉันต้องการสนับสนุนโดยที่สตริงวันที่ไม่มีตัวบ่งชี้เขตเวลา ฉันได้แก้ไขแหล่งข้อมูลแล้ว แต่ฉันยังต้องการสนับสนุนรูปแบบข้อมูลดั้งเดิม การแปลงครั้งเดียวของข้อมูลดั้งเดิมไม่ใช่ตัวเลือกสำหรับเหตุผลทางธุรกิจที่หลากหลาย โดยทั่วไปแล้วฉันไม่ชอบความคิดในการเข้ารหัสเขตเวลาเริ่มต้นอย่างหนักในกรณีนี้ดูเหมือนว่าจะเป็นตัวเลือกที่ดีที่สุด ฉันรู้ด้วยความมั่นใจอย่างสมเหตุสมผลว่าข้อมูลดั้งเดิมที่เป็นปัญหาทั้งหมดอยู่ใน UTC ดังนั้นฉันจึงเตรียมที่จะยอมรับความเสี่ยงของการผิดนัดในกรณีนี้
import datetime; datetime.datetime.now(datetime.timezone.utc)
tz
arg ที่มีชื่อเพื่อให้อ่านง่ายขึ้น:datetime.datetime.now(tz=datetime.timezone.utc)
unaware.replace()
จะกลับมาNone
ถ้ามันแก้ไขunaware
วัตถุในสถานที่ REPL แสดงว่า.replace()
ส่งคืนdatetime
วัตถุใหม่ที่นี่