PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Stoppen Sie Django, Zeiten in UTC zu übersetzen

Du interpretierst das falsch. Die Datenbank speichert meistens eine UTC-Zeit. Wenn Sie PostgreSQL verwenden, kann die Datenbank eine Zeit mit Zeitzoneninformationen speichern, aber aus praktischen Gründen (*) ist es am einfachsten zu glauben, dass die Zeit in Ihrer Datenbank als UTC gespeichert ist (d. h. als absolute Zeit, die in jede Zeit konvertiert werden kann Zone), wenn USE_TZ = True . Es stellt immer einen korrekten Zeitpunkt dar, für den Sie sich keine Zeitzone merken oder annehmen müssen. Und soweit ich weiß, speichert Django die Zeit immer als zeitbewusst in der UTC-Zeitzone.

Wenn Sie also das Zeitobjekt mit select abrufen in psql , erhalten Sie die Zeit in der lokalen Zeitzone Ihres Computers zurück (die Zeitzone, in der Sie psql ausführen). Wenn jemand in "America/New_York" dieselbe Auswahlabfrage ausführen würde, würde er einen -04-Zeitstempel sehen. Wenn das Datum der 20.03.2019 gewesen wäre, hätten Sie 2019-03-20 10:50:00+00 gesehen denn an diesem Datum waren Europa/London und UTC gleich.

Beim Abrufen des Werts eines DateTimeField als Python datetime.datetime Objekt, holt Django immer den UTC-Wert, denn:

Dies erleichtert die Arbeit mit diesen datetime-Objekten in Ihrem Python-Code:Sie sind immer UTC-Zeiten.

Wenn Sie diese Werte in einer PDF-Datei drucken möchten, verwenden Sie die gleichen Methoden, die Django für das Rendern von Vorlagen verwendet:

from django.utils import timezone
print(timezone.template_localtime(Booking.objects.get(pk=280825).start))

Dies rendert die Datumszeit in der Standardzeitzone (oder wenn Sie activate() einer anderen Zeitzone, in der aktuellen Zeitzone ).

(*) Hinweis:Warum Sie der in Ihrer Datenbank gespeicherten Zeitzone keine Bedeutung beimessen und einfach darüber nachdenken sollten, als wäre alles UTC:Wenn Sie Server in verschiedenen Zeitzonen betreiben, könnten Sie tatsächlich Zeitstempel in verschiedenen Zeitzonen speichern . Sie sind immer noch alle korrekt (absolute Zeitstempel) und können in jede andere Zeitzone konvertiert werden. Daher ist die zum Speichern verwendete Zeitzone im Grunde bedeutungslos.