SORU
15 AĞUSTOS 2011, PAZARTESİ


Nasıl habersiz datetime bir zaman dilimi python ile haberdar olun

Ne yapmam gerekiyor

Hangi zaman dilimi tanımayan diğer datetime nesneler ile mukayese edebilmek için bir saat dilimi eklemek istiyorum dilimimi-habersiz bir datetime nesne var. Bu bir miras davası için habersiz bir zaman dilimi için benim bütün uygulama dönüştürmek istemiyorum.

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, astimezone çalıştım:

>>> 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ışarak beri bu başarısız çok şaşırtıcı bir durum değil. Yerine daha iyi bir seçenek gibi göründü (Python: How to get a value of datetime.today() that is "timezone aware"?) başı olarak:

>>> 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
>>> 

Ama gördüğünüz gibi, yerine tzinfo ayarlayın, ancak nesne farkında değil gibi görünüyor. Doktorluk geri girdi dizesini ayrıştırma önce bir zaman dilimi var düşmeye hazırlanıyorum (eğer sorun buysa tabii ayrıştırma için dateutil kullanıyorum), ama yine de çok kludgy görünüyor.

Ayrıca, her iki python 2.6 bu denedim ve python ile aynı sonuçları 2.7,.

Bağlam

Bazı veri dosyaları için bir ayrıştırıcı yazıyorum. Tarih dizesi saat dilimi göstergesi yok destek lazım eski bir biçimi vardır. Zaten veri kaynağı tamir ettim, ama ben hala eski veri biçimi desteği gerekiyor. Eski verileri tek seferlik bir dönüşüm çeşitli iş BS nedenlerden dolayı bir seçenek değildir. Bu durumda genel olarak, sabit kodlama varsayılan bir saat dilimi fikrini sevmiyorum, en iyi seçenek gibi görünüyor. Söz konusu tüm eski veriler bu durumda olduğunu varsaymak riski kabul etmeye hazırım yani UTC, makul güven ile biliyorum.

CEVAP
15 AĞUSTOS 2011, PAZARTESİ


Genel olarak, saf bir datetime için uyumlu saat dilimi localize method kullanımı:

import datetime
import pytz

unaware = datetime.datetime(2011, 8, 15, 8, 15, 12, 0)
aware = datetime.datetime(2011, 8, 15, 8, 15, 12, 0, pytz.UTC)

now_aware = pytz.utc.localize(unaware)
assert aware == now_aware

UTC zaman dilimi için, gerçekten gerekli işlemek için yaz saati hesaplama yok beri localize kullanmak için:

now_aware = unaware.replace(tzinfo=pytz.UTC)

çalışır. (.replace döner yeni bir datetime; değiştirmez unaware.)

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • adrianisen

    adrianisen

    25 Kasım 2009
  • Gavin Hoey

    Gavin Hoey

    21 Aralık 2007
  • LAHWF

    LAHWF

    5 Kasım 2009