Apa yang harus saya lakukan
Saya memiliki objek waktu-waktu tidak sadar zona waktu, yang saya perlu menambahkan zona waktu agar dapat membandingkannya dengan objek waktu-waktu sadar-waktu-zona waktu lainnya. Saya tidak ingin mengonversi seluruh aplikasi saya ke zona waktu tanpa mengetahui untuk kasus warisan yang satu ini.
Apa yang saya coba
Pertama, untuk menunjukkan masalahnya:
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
Pertama, saya mencoba 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
>>>
Tidak terlalu mengejutkan bahwa ini gagal, karena sebenarnya mencoba melakukan konversi. Ganti sepertinya pilihan yang lebih baik (sesuai Python: Cara mendapatkan nilai datetime.today () yaitu "timezone aware"? ):
>>> 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
>>>
Tapi seperti yang Anda lihat, ganti tampaknya mengatur tzinfo, tetapi tidak membuat objek sadar. Saya sedang bersiap-siap untuk kembali ke doctoring string input untuk memiliki zona waktu sebelum parsing (saya menggunakan dateutil untuk parsing, jika itu penting), tapi itu tampaknya sangat muram.
Juga, saya sudah mencoba ini di kedua python 2.6 dan python 2.7, dengan hasil yang sama.
Konteks
Saya menulis parser untuk beberapa file data. Ada format lama yang saya perlukan untuk mendukung di mana string tanggal tidak memiliki indikator zona waktu. Saya sudah memperbaiki sumber data, tetapi saya masih perlu mendukung format data lawas. Konversi satu kali data legacy bukan pilihan untuk berbagai alasan BS bisnis. Sementara secara umum, saya tidak suka gagasan hard-coding zona waktu default, dalam hal ini sepertinya pilihan terbaik. Saya tahu dengan keyakinan yang masuk akal bahwa semua data lawas yang dimaksud adalah dalam UTC, jadi saya siap untuk menerima risiko gagal bayar itu dalam hal ini.
import datetime; datetime.datetime.now(datetime.timezone.utc)
tz
arg agar lebih mudah dibaca:datetime.datetime.now(tz=datetime.timezone.utc)
unaware.replace()
akan kembaliNone
jika itu memodifikasiunaware
objek di tempat. REPL menunjukkan bahwa.replace()
mengembalikandatetime
objek baru di sini.