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


85

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 및 기존 데이터를 근본적으로 변경해야하는지에 대해 혼란스러워합니다.

답변:


168

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

일반적으로 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)하여 비활성화 할 수 있습니다.


4
Django는 TimeField에 대한 인식 시간을 저장하지 않으며 DateTimeField에 대해서만 저장합니다. 파이썬 datetime.time 객체는 datetime.datetime 객체와 마찬가지로 TZINFO를 지원하므로 정말 짜증납니다. 나는 그들이 다음 릴리스에서 그것을 고칠 것이라고 생각합니다. Btw 나는 postres 9.1 데이터베이스 서버에서 테스트했습니다.
tejinderss jul.

@tejinderss : datetime.time잘못되었습니다. 'Asia/Shanghai'날짜를 모르는 경우 시간대 를 저장할 필요가 없습니다 (UTC 오프셋은 같은 시간에 다른 날짜에 다를 수 있음).
jfs

@okm : 현지 시간대와 다를 make_aware(datetime.now(), get_default_timezone())경우 실패 get_default_timezone()합니다 (전체적으로 신뢰할 수있는 것은 아닙니다). 그냥 사용하는 timezone.now()대신 (이 시간대를 인식하는 경우입니다 USE_TZ입니다 True).
jfs
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.