Ich versuche, das aktuelle Datum und die aktuelle Uhrzeit mit den in Modellen angegebenen Datums- und Uhrzeitangaben mithilfe von Vergleichsoperatoren zu vergleichen:
if challenge.datetime_start <= datetime.now() <= challenge.datetime_end:
Das Skript fehlerhaft mit:
TypeError: can't compare offset-naive and offset-aware datetimes
Die Modelle sehen folgendermaßen aus:
class Fundraising_Challenge(models.Model):
name = models.CharField(max_length=100)
datetime_start = models.DateTimeField()
datetime_end = models.DateTimeField()
Ich habe auch Django mit Datum und Uhrzeit des Gebietsschemas.
Was ich nicht finden konnte, ist das Format, das Django für DateTimeField () verwendet. Ist es naiv oder bewusst? Und wie kann ich datetime.now () dazu bringen, das Gebietsschema datetime zu erkennen?
python
django
datetime
comparison
sccrthlt
quelle
quelle
Antworten:
Standardmäßig befindet sich das
datetime
Objektnaive
in Python, daher müssen Sie beidedatetime
Objekte entweder naiv oder bewusst machen . Dies kann erfolgen mit:Hinweis: Dies würde ein
ValueError
iftzinfo
auslösen, das bereits gesetzt ist. Wenn Sie sich nicht sicher sind, verwenden Sie einfachÜbrigens können Sie einen UNIX-Zeitstempel im Objekt datetime.datetime mit den folgenden Zeitzoneninformationen formatieren
quelle
tzinfo
führt keine Konvertierung durch, wodurch der Vergleich falsch wird.utc = pytz.utc
, um den Pylint-Fehler zu verhindernNo value for argument 'dt' in unbound method call (no-value-for-parameter)
. Pytz Linkdatetime.datetime.now
ist nicht zeitzonenbewusst.Django kommt mit einem Helfer dafür, was erfordert
pytz
Sie sollten vergleichen können
now
zuchallenge.datetime_start
quelle
USE_TZ=True
danntimezone.now()
ein zeitzonenbewusstes datetime-Objekt zurück, auch wennpytz
es nicht installiert ist (obwohl die Installation aus anderen Gründen empfohlen werden kann).Eine Codezeilösung
Erklärte Version
Zusammenfassung
Sie müssen die Zeitzoneninformationen zu Ihrer
now()
Datumszeit hinzufügen.Sie müssen jedoch dieselbe Zeitzone der Referenzvariablen hinzufügen . Deshalb habe ich zuerst das
tzinfo
Attribut gelesen .quelle
Zeitzone deaktivieren. Verwenden
challenge.datetime_start.replace(tzinfo=None);
Sie können auch
replace(tzinfo=None)
für andere Datums- / Uhrzeitangaben verwenden .quelle
Die Art und Weise, wie ich dieses Problem lösen würde, besteht darin, sicherzustellen, dass die beiden Datumszeiten in der richtigen Zeitzone liegen.
Ich kann sehen, dass Sie verwenden,
datetime.now()
wodurch die aktuelle Uhrzeit des Systems zurückgegeben wird, ohne dass tzinfo eingestellt ist.tzinfo sind die Informationen, die an eine Datumszeit angehängt sind, um sie über die Zeitzone zu informieren. Wenn Sie eine naive Datumszeit verwenden, müssen Sie im gesamten System konsistent sein. Ich würde nur empfehlen, nur zu verwenden
datetime.utcnow()
Da Sie irgendwo eine Datums- und Uhrzeitangabe erstellen, mit der tzinfo verknüpft ist, müssen Sie sicherstellen, dass diese mit der richtigen Zeitzone lokalisiert sind (mit tzinfo verknüpft ist).
Werfen Sie einen Blick auf Delorean , es erleichtert den Umgang mit solchen Dingen erheblich.
quelle
Es funktioniert von mir. Hier geete ich die erstellte Tabelle datetime und füge 10 Minuten zur datetime hinzu. Später werden abhängig von der aktuellen Zeit Ablaufvorgänge ausgeführt.
10 Minuten zur Datenbank-Datumszeit hinzugefügt
table_datetime = '2019-06-13 07: 49: 02.832969' (Beispiel)
Es hat bei mir funktioniert.
quelle
Gerade:
Also mach das:
und dann benutze
start_time
undend_time
quelle