530 Stimmen

RuntimeWarning: DateTimeField hat ein nicht lokalisiertes Datum und Uhrzeit erhalten

Ich versuche, eine einfache E-Mail mit IPython zu senden. Ich habe noch keine Modelle eingerichtet, bekomme aber trotzdem diesen Fehler. Was kann getan werden?

Fehler: /home/sourabh/Django/learn/local/lib/python2.7/site-packages/django/db/models/fields/init.py:827: RuntimeWarning: DateTimeField hat ein naives Datum/Uhrzeit (2013-09-04 14:14:13.698105) erhalten, während die Unterstützung für Zeitzonen aktiv ist. RuntimeWarning)

Versucht: Der erste Schritt ist, USE_TZ = True zu Ihrer Einstellungsdatei hinzuzufügen und pytz zu installieren (wenn möglich).

Fehler geändert:

(learn)sourabh@sL:~/Django/learn/event$ python manage.py shell
/home/sourabh/Django/learn/local/lib/python2.7/site-packages/django/db/backends/sqlite3/base.py:53: RuntimeWarning: SQLite hat ein naives Datum/Uhrzeit (2013-09-05 00:59:32.181872) erhalten, während die Unterstützung für Zeitzonen aktiv ist.
  RuntimeWarning)

18voto

Edouard Thiel Punkte 5024

Eine Warnung kann behoben werden und die in settings.py angegebene Zeitzone verwendet werden, die möglicherweise von UTC abweicht.

Zum Beispiel habe ich in meiner settings.py:

USE_TZ = True
TIME_ZONE = 'Europe/Paris'

Hier ist eine Lösung; der Vorteil ist, dass str(mydate) die richtige Zeit liefert:

>>> from datetime import datetime
>>> from django.utils.timezone import get_current_timezone
>>> mydate = datetime.now(tz=get_current_timezone())
>>> mydate
datetime.datetime(2019, 3, 10, 11, 16, 9, 184106, 
    tzinfo=)
>>> str(mydate)
'2019-03-10 11:16:09.184106+01:00'

Ein weiteres äquivalentes Verfahren ist die Verwendung von make_aware, siehe dmrz Post.

15voto

radtek Punkte 30114

Sie können auch Einstellungen überschreiben, was besonders nützlich in Tests ist:

from django.test import override_settings

with override_settings(USE_TZ=False):
    # Fügen Sie hier Ihren Code ein, der die Warnung verursacht
    pass

Dadurch wird verhindert, dass Sie die Warnung sehen, während gleichzeitig alles in Ihrem Code, das ein zeitzonebewusstes Datum erfordert, Probleme verursachen kann. Wenn dies der Fall ist, lesen Sie die Antwort von kravietz.

14voto

hcf1425 Punkte 539

Wenn Sie versuchen, eine naive Datum/Uhrzeit in ein Datum/Uhrzeit mit Zeitzonenumwandeln in Django, hier ist meine Lösung:

>>> import datetime
>>> from django.utils import timezone
>>> t1 = datetime.datetime.strptime("2019-07-16 22:24:00", "%Y-%m-%d %H:%M:%S")
>>> t1
    datetime.datetime(2019, 7, 16, 22, 24)
>>> current_tz = timezone.get_current_timezone()
>>> t2 = current_tz.localize(t1)
>>> t2
    datetime.datetime(2019, 7, 16, 22, 24, tzinfo=)
>>>

t1 ist eine naive Datum/Uhrzeit und t2 ist ein Datum/Uhrzeit mit Zeitzonenum Django's Einstellungen.

8voto

dehidehidehi Punkte 119

Im Modell den Wert nicht übergeben:

timezone.now()

Entfernen Sie stattdessen die Klammern und übergeben Sie:

timezone.now

Wenn Sie weiterhin eine Laufzeitfehlerwarnung erhalten, erwägen Sie, das Modellfeld von DateTimeField auf DateField zu ändern.

1voto

codecumber Punkte 102

Wenn Sie den aktuellen Datumsskript in ein Datumsobjekt umwandeln müssen, habe ich die Warnung einfach durch Verwendung von astimezone entfernt:

>>> from datetime import datetime, timezone
>>> datetime_str = '2013-09-04 14:14:13.698105'
>>> datetime_object = datetime.strptime(datetime_str, "%Y-%m-%d %H:%M:%S.%f")
>>> datetime_object.astimezone(timezone.utc)
datetime.datetime(2013, 9, 4, 6, 14, 13, 698105, tzinfo=datetime.timezone.utc)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X