SORU
18 Mayıs 2012, Cuma


django 1.4 - 't-ofset naif ve duyarlı ofset karşılaştırın datetimes

1.4 django 1.2 bir uygulama geçiş sürecinde yaşıyorum.

Günlük bir görev, görev tamamlanacak günün bir saatini içerir: nesne var

class DailyTask(models.Model):
    time = models.TimeField()
    last_completed = models.DateTimeField()
    name = models.CharField(max_length=100)
    description = models.CharField(max_length=1000)
    weekends = models.BooleanField()

    def __unicode__(self):
        return '%s' % (self.name)

    class Meta:
        db_table = u'dailytask'
        ordering = ['name']

Eğer bir görev hala bugün tamamlanması için gerekli olup olmadığını kontrol etmek için aşağıdaki kodu var:

def getDueDailyTasks():
    dueDailyTasks=[]
    now = datetime.datetime.now()
    try:
        dailyTasks = DailyTask.objects.all()
    except dailyTask.DoesNotExist:
        return None
    for dailyTask in dailyTasks:
        timeDue = datetime.datetime(now.year,now.month,now.day,dailyTask.time.hour,dailyTask.time.minute,dailyTask.time.second)
        if timeDue<now and timeDue>dailyTask.last_completed:
            if dailyTask.weekends==False and now.weekday()>4:
                pass
            else:
                dueDailyTasks.append({'id':dailyTask.id,
                            'due':timeDue,
                             'name': dailyTask.name,
                             'description':dailyTask.description})
    return dueDailyTasks

Bu güzel 1.2 ama 1.4 altında hata alıyorum altında çalıştı:

can't compare offset-naive and offset-aware datetimes

hattı nedeniyle

if timeDue<now and timeDue>dailyTask.last_completed

ve her iki karşılaştırma tümceleri bu hata atmak.

TimeDue saat dilimi farkında yapma pytz ekleyerek denedim.Bağımsız değişken olarak UTC, ama bu hala aynı hata yükseltir.

Dilimleri üzerine doktorlar bir kısmını okudum ama ben sadece timeDue saat dilimi farkında yapmak için gerekli olup olmadığını, ya da benim db ve mevcut veri için temel bir değişiklik yapmam gerek olmadığı konusunda kafam karışır.

Takdir yardım!

CEVAP
18 Mayıs 2012, Cuma


Ayrıntılı bilgi için kontrol the thorough document.

Normalde, django.utils.timezone.now ofset-farkında geçerli bir datetime yapmak için kullanın

>>> from django.utils import timezone
>>> timezone.now()
datetime.datetime(2012, 5, 18, 13, 0, 49, 803031, tzinfo=<UTC>)

Ve ofset uyumlu bir datetime yapmak django.utils.timezone.make_aware

>>> timezone.make_aware(datetime.datetime.now(), timezone.get_default_timezone())
datetime.datetime(2012, 5, 18, 21, 5, 53, 266396, tzinfo=<DstTzInfo 'Asia/Shanghai' CST 8:00:00 STD>)

O zaman ikimiz de farkında ofset datetimes w/sorun Ç karşılaştırabilirsiniz.

Ayrıca, saat dilimi bilgi soyunarak ofset-awared-saf ofset datetime datetime dönüştürmek olabilir, o zaman w/ normal kıyaslanacak datetime.datetime.now() altında utc.

>>> t = timezone.now() # offset-awared datetime
>>> t.astimezone(timezone.utc).replace(tzinfo=None)
datetime.datetime(2012, 5, 18, 13, 11, 30, 705324)

USE_TZ True 'varsayılan' (aslında False varsayılan olarak, ancak settings.py dosyası tarafından oluşturulan django-admin.py startproject set True), o zaman senin DB destekler dilimimi-farkında kez, değerler zamanla ilgili model alanlar olacaktır zaman dilimi farkında. (ya da sadece USE_TZ=TrueKaldır) ayarları USE_TZ=False ayarlayarak devre dışı bırakın.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • backyardjay

    backyardjay

    8 ŞUBAT 2009
  • graham025

    graham025

    25 NİSAN 2006
  • Nick Pitera

    Nick Pitera

    8 NİSAN 2006