Python’da saat dilimine duyarlı bir tarih saat nesnesi nasıl yapılır?

| | | | | | | | | | | | | | | | | | |

Yapmam gerekenler

Saat diliminden habersiz bir tarih saat nesnem var ve diğerleriyle karşılaştırabilmek için bir saat dilimi eklemem gerekiyor. saat dilimine duyarlı tarih saat nesneleri. Bu eski örnek olaydan habersiz tüm uygulamamı saat dilimine dönüştürmek istemiyorum.

Denediklerim

Önce sorunu göstermek için :

Python 2.6.1 (r261:67515, 24 Haziran 2010, 21:47:49) Darwin'de [GCC 4.2.1 (Apple Inc. build 5646)] "help" yazın; , "telif hakkı", "krediler" veya "lisans" ,15,8,15,12,0) >>> habersiz datetime.datetime(2011, 8, 15, 8, 15, 12) >>> farkında = datetime.datetime(2011,8, 15,8,15,12,0,pytz.UTC) >>> farkında datetime.datetime(2011, 8, 15, 8, 15, 12, tzinfo=<UTC>) >>> farkında == habersiz Geri İzleme (en son çağrı): Dosya "stdin>", satır 1, <module> TypeError: offset-naif ve offset-bilinçli tarihler karşılaştırılamaz 

Önce, astimezone'u denedim:

>>> unaware.astimezone(pytz.UTC) Geri İzleme (en son çağrı son): Dosya "stdin>quot;, satır 1, <module> ValueError: astimezone(), saf bir tarih saatine uygulanamaz >>> 

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'da datetime.today() öğesinin "zaman dilimi farkında" değerini nasıl alabilirim?):

>>> unaware.replace(tzinfo=pytz.UTC) datetime.datetime(2011, 8, 15, 8, 15, 12, tzinfo=<UTC>) >>> habersiz == farkında Geri İzleme (en son arama son): Dosya "stdin>quot;, satır 1, <module> TypeError: mahsup-naif ve ofset-farklı tarih-saatleri karşılaştıramazsınız >>> 

Ancak gördüğünüz gibi, replace tzinfo'yu ayarlıyor gibi görünüyor, ancak nesneyi haberdar etmiyor . Giriş dizesini ayrıştırmadan önce bir saat dilimine sahip olacak şekilde değiştirmeye hazırlanıyorum (eğer önemliyse, ayrıştırma için dateutil kullanıyorum), ancak bu inanılmaz derecede zor görünüyor.

Ayrıca, Bunu hem Python 2.6'da hem de Python 2.7'de denedim, aynı sonuçlarla.

Bağlam

Bazı veri dosyaları için bir ayrıştırıcı yazıyorum. Tarih dizesinin saat dilimi göstergesine sahip olmadığı durumlarda desteklemem gereken eski bir biçim var. Veri kaynağını zaten düzelttim, ancak yine de eski veri biçimini desteklemem gerekiyor. Eski verilerin tek seferlik dönüştürülmesi, çeşitli ticari BS nedenleriyle bir seçenek değil. Genel olarak, zor fikrini sevmiyorum -varsayılan bir saat dilimini kodlamak, bu durumda en iyi seçenek gibi görünüyor. Söz konusu tüm eski verilerin UTC'de olduğunu makul bir güvenle biliyorum, bu yüzden bu durumda varsayılana dönme riskini kabul etmeye hazırım.