Yapmam gerekenler
Diğer saat dilimine duyarlı datetime nesneleri ile karşılaştırmak için bir saat dilimi eklemeniz gereken bir saat dilimi farkında olmayan datetime nesnesi var. Uygulamamı bu eski durum için habersiz saat dilimine dönüştürmek istemiyorum.
Ne Denedim
İlk olarak, sorunu göstermek için:
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
İlk olarak astimezon denedim:
>>> unaware.astimezone(pytz.UTC)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: astimezone() cannot be applied to a naive datetime
>>>
Aslında bir dönüşüm yapmaya çalıştığı için bunun başarısız olması çok şaşırtıcı değil. Değiştir daha iyi bir seçim gibi görünüyordu ( Python'a göre: "Saat dilimi farkında" bir datetime.today () değeri nasıl elde edilir? ):
>>> 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
>>>
Ancak gördüğünüz gibi, yerine koymak tzinfo'yu ayarlıyor gibi görünüyor, ancak nesneyi farkında kılmıyor. Ayrıştırmadan önce bir zaman dilimi için giriş dizesini doktora geri düşmeye hazır alıyorum (ayrıştırmak için dateutil kullanıyorum, bu önemliyse), ama bu inanılmaz derecede küstah görünüyor.
Ayrıca, bunu hem python 2.6 hem de python 2.7'de aynı sonuçlarla denedim.
bağlam
Bazı veri dosyaları için ayrıştırıcı yazıyorum. Tarih dizesinin saat dilimi göstergesi olmadığında desteklemem gereken eski bir biçim var. Veri kaynağını zaten düzelttim, ancak hala eski veri biçimini desteklemem gerekiyor. Eski verilerin bir defalık dönüşümü, çeşitli işletme BS nedenleri için bir seçenek değildir. Genel olarak, varsayılan bir saat dilimini zor kodlama fikrinden hoşlanmıyorum, bu durumda en iyi seçenek gibi görünüyor. Söz konusu tüm eski verilerin UTC'de olduğunu makul bir şekilde biliyorum, bu yüzden bu durumda varsayılan olarak kabul etme riskini kabul etmeye hazırım.
import datetime; datetime.datetime.now(datetime.timezone.utc)
tz
Daha okunabilir olabilmek için adlandırılmış arg'u kullanacağım :datetime.datetime.now(tz=datetime.timezone.utc)
unaware.replace()
nesne yerindeNone
değiştiriliyorsa geri dönecektirunaware
. REPL, burada.replace()
yeni birdatetime
nesne döndürdüğünü gösterir .