2012-05-15 2 views
8

Ich habe ein Feld timestamp = models.DateTimeField (auto_now_add = True) in der Datenbank. Ich möchte den Unterschied zwischen diesem Zeitstempel und datetime.now() finden.Datums- und Zeitstempel in Django nicht abziehen?

Als ich versuchte, DateTime.Now() - Zeitstempel, erhalte ich die Fehlermeldung:

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

Wie kann ich dieses Problem beheben?

+0

mögliches Duplikat von [Offset-naive und offsetfähige Datumsangaben können nicht subtrahiert werden] (http://stackoverflow.com/questions/796008/cant-subtract-offset-naive-and-offset-aware-datetimes) – user1023979

Antwort

20

Dieser Fehler bezieht sich darauf, wie Zeiten von Python gespeichert werden. Nach dem Python 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.

Die django documentation auch fest, dass:

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) 

Sie sollten bestimmen, ob Sie Zeitzone Bewusstsein in Ihrer Website wollen und Passen Sie dann Ihre gespeicherten Zeiten entsprechend an. So konvertieren ein bewusst dt zu naiv können Sie die pytz module verwenden und dies tun:

naive_dt = aware_dt.replace(tzinfo=None) 

Dies funktioniert, weil alle Python Datetimes haben eine optionale Zeitzone Attribut, tzinfo, die verwendet werden können, um Informationen über die der dt Offset von UTC Zeit.

0

Holá
Die kurze Antwort lautet:

tz_info = your_timezone_aware_variable.tzinfo 

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

Sie müssen die Zeitzone weitere Infos auf die jetzt() Zeit hinzufügen.
Aber Sie müssen die selbe Zeitzone der Variablen hinzufügen, deshalb habe ich zuerst das TZinfo-Attribut gelesen.