2012-05-15 65 views
8

Tengo un campo timestamp = models.DateTimeField (auto_now_add = True) en el db. Quiero encontrar la diferencia entre esa marca de tiempo y datetime.now().No se puede restar fecha y hora en django?

Cuando traté datetime.now() - marca de tiempo, me sale el error:

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

¿Cómo puedo solucionar esto?

+0

posible duplicación de [No se pueden restar las fechas de anticipo compensadas y anticuadas] (http://stackoverflow.com/questions/796008/cant-subtract-offset-naive-and-offset-aware-datetimes) – user1023979

Respuesta

20

Este error se refiere a cómo Python almacena los tiempos. De acuerdo con la pitón documentation:

There are two kinds of date and time objects: “naive” and “aware”. This distinction refers to whether the object has any notion of time zone, daylight saving time, or other kind of algorithmic or political time adjustment.

El Django documentation también establece que:

When time zone support is disabled, Django uses naive datetime objects in local time. This is simple and sufficient for many use cases. In this mode, to obtain the current time, you would write:

import datetime 
now = datetime.datetime.now() 

When time zone support is enabled, Django uses time-zone-aware datetime objects. If your code creates datetime objects, they should be aware too. In this mode, the example above becomes:

import datetime 
from django.utils.timezone import utc 
now = datetime.datetime.utcnow().replace(tzinfo=utc) 

Usted debe determinar si desea o no que la conciencia zona horaria en su sitio y luego ajuste sus tiempos almacenados en consecuencia. Para convertir una cuenta dt a ingenua puede utilizar el pytz module y hacer esto:

naive_dt = aware_dt.replace(tzinfo=None) 

Esto funciona porque todos datetimes pitón tienen un atributo zona horaria opcional, tzinfo, que se puede utilizar para almacenar información sobre el DT de desplazamiento de UTC hora.

0

Holá
La respuesta corta es:

tz_info = your_timezone_aware_variable.tzinfo 

diff = datetime.datetime.now(tz_info) - your_timezone_aware_variable: 

Debe agregar la información de zona horaria a la hora actual().
Pero debe agregar misma zona horaria de la variable, por eso primero leí el atributo tzinfo.

Cuestiones relacionadas