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