[python] django 1.4-오프셋 순진 및 오프셋 인식 날짜 시간을 비교할 수 없음

django 1.2에서 1.4로 애플리케이션을 마이그레이션하는 중입니다.

작업을 완료해야하는 시간이 포함 된 일일 작업 개체가 있습니다.

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

오늘도 작업을 완료해야하는지 확인하기 위해 다음 코드가 있습니다.

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

이것은 1.2에서 잘 작동했지만 1.4에서는 오류가 발생합니다.

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

라인 때문에

if timeDue<now and timeDue>dailyTask.last_completed

두 비교 절 모두이 오류가 발생합니다.

pytz.UTC를 인수로 추가하여 timeDue 시간대를 인식하도록 시도했지만 여전히 동일한 오류가 발생합니다.

시간대에 대한 문서 중 일부를 읽었지만 timeDue 시간대를 인식해야하는지 아니면 DB 및 기존 데이터를 근본적으로 변경해야하는지에 대해 혼란스러워합니다.



답변

자세한 정보 는 철저한 문서 를 확인하십시오 .

일반적으로 django.utils.timezone.now오프셋을 인식하는 현재 날짜 시간을 만드는 데 사용 합니다.

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

그리고 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>)

그런 다음 문제없이 두 오프셋 인식 날짜 시간을 비교할 수 있습니다.

또한 시간대 정보를 제거하여 offset-awared datetime을 offset-naive datetime으로 변환 한 다음 datetime.datetime.now()utc 아래에서 normal과 비교할 수 있습니다 .

>>> 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‘기본적으로'(사실 그건 False기본적으로하지만, settings.py파일에 의해 생성 django-admin.py startproject그것에는 세트 True), 다음 DB 지원 시간대를 인식하는 시간이 경우, 시간 관련 모델 필드의 값이 시간대 인식 될 것이다. 설정에서 설정 USE_TZ=False(또는 간단히 제거 USE_TZ=True)하여 비활성화 할 수 있습니다.


답변