Estoy en el proceso de migrar una aplicación de django 1.2 a 1.4.
Tengo un objeto de tarea diaria que contiene una hora del día en que esa tarea debe completarse:
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 una tarea aún debe completarse 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 timeDuedailyTask.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 bajo 1.2, pero debajo de 1.4 me sale el error:
can't compare offset-naive and offset-aware datetimes
debido a la linea
if timeDuedailyTask.last_completed
y ambas cláusulas de comparación arrojan este error.
He intentado hacer que TimeDue sea consciente de la zona horaria agregando pytz.UTC como un argumento, pero esto todavía genera el mismo error.
He leído algunos de los documentos en las zonas horarias, pero estoy confundido en cuanto a si solo necesito hacer que la Zona horaria sea correcta o si debo hacer un cambio fundamental en mi db y en los datos existentes.
Consulte el documento completo para obtener información detallada.
Normalmente, use django.utils.timezone.now
para hacer una fecha y hora actual sensible al desplazamiento
>>> from django.utils import timezone >>> timezone.now() datetime.datetime(2012, 5, 18, 13, 0, 49, 803031, tzinfo=)
Y django.utils.timezone.make_aware
para hacer una fecha y hora de compensación.
>>> timezone.make_aware(datetime.datetime.now(), timezone.get_default_timezone()) datetime.datetime(2012, 5, 18, 21, 5, 53, 266396, tzinfo=)
A continuación, puede comparar ambas fechas de datos con compensación de desplazamiento sin problemas.
Además, puede convertir la fecha y hora de compensación compensada en la fecha y hora de ausencia de compensación eliminando la información de la zona horaria, y luego podría compararse con la datetime.datetime.now()
/ datetime.datetime.now()
, debajo de 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
por defecto, pero el archivo settings.py
generado por django-admin.py startproject
establece en True
), entonces si su base de datos admite tiempos de huso horario, los valores del modelo relacionado con el tiempo los campos serían conscientes de la zona horaria. puede deshabilitarlo estableciendo USE_TZ=False
(o simplemente elimine USE_TZ=True
) en la configuración.