python - than - django 1.4: no se pueden comparar fechas de fechas sin desplazamiento y fechas de compensaciĆ³n
python date greater than (1)
Consulte el documento completo para obtener información detallada.
Normalmente, use django.utils.timezone.now
para crear un datetime actual compatible con offset
>>> from django.utils import timezone
>>> timezone.now()
datetime.datetime(2012, 5, 18, 13, 0, 49, 803031, tzinfo=<UTC>)
Y django.utils.timezone.make_aware
para hacer un datetime consciente de offset
>>> 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>)
Luego puede comparar los tiempos de fecha de compensación con problemas.
Además, puede convertir la fecha de vencimiento compensada a la fecha de inicio simplificada eliminando la información de la zona horaria, luego se podría comparar con la datetime.datetime.now()
/ datetime.datetime.now()
normal. datetime.datetime.now()
, bajo 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
es True
''por defecto'' (en realidad es False
de forma predeterminada, pero el archivo settings.py
generado por django-admin.py startproject
establece en True
), luego si su DB es compatible con los tiempos de la zona horaria, los valores del modelo relacionado con el tiempo los campos serían conscientes de la zona horaria. puede desactivarlo configurando USE_TZ=False
(o simplemente elimine USE_TZ=True
) en la configuración.
Estoy en el proceso de migrar una aplicación de django 1.2 a 1.4.
Tengo un objeto de tarea diario que contiene una hora del día en que se debe completar la tarea:
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'']
Para verificar si todavía se requiere completar una tarea hoy, tengo el siguiente código:
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
Esto funcionó bien en 1.2, pero en 1.4 recibo el error:
can''t compare offset-naive and offset-aware datetimes
debido a la linea
if timeDue<now and timeDue>dailyTask.last_completed
y ambas cláusulas de comparación arrojan este error.
Intenté hacer timeDue timezone consciente agregando pytz.UTC como argumento, pero esto aún provoca el mismo error.
He leído algunos de los documentos en husos horarios, pero estoy confundido sobre si solo tengo que hacer que timezone sea reconocida por la zona horaria o si necesito hacer un cambio fundamental en mi base de datos y en los datos existentes.