Du tolkar detta fel. Databasen lagrar en UTC-tid för det mesta. Om du använder PostgreSQL kan databasen lagra en tid med tidszonsinformation, men av praktiska skäl (*) är det enklast att bara tro att tiden i din db är lagrad som UTC (dvs som en absolut tid som kan konverteras till vilken tid som helst zon) när USE_TZ = True
. Den representerar alltid en korrekt tidpunkt för vilken du inte behöver komma ihåg eller anta någon tidszon. Och så vitt jag vet kommer Django alltid att lagra tiden som tidsmedveten i UTC-tidszonen.
Så när du hämtar tidsobjektet med select
i psql , du får tillbaka tiden i din maskins lokala tidszon (tidszonen där du kör psql). Om någon i "America/New_York" skulle köra samma urvalsfråga, skulle hon se en -04 tidsstämpel. Hade datumet varit 2019-03-20, skulle du ha sett 2019-03-20 10:50:00+00
för det datumet var Europa/London och UTC desamma.
När du hämtar värdet för ett DateTimeField
som en python datetime.datetime
objekt, hämtar Django alltid UTC-värdet, eftersom:
Detta gör det lättare att arbeta med dessa datetime-objekt i din pythonkod:De är alltid UTC-tider.
Om du vill skriva ut dessa värden i en PDF, använd samma metoder som Django använder för mallrenderingen:
from django.utils import timezone
print(timezone.template_localtime(Booking.objects.get(pk=280825).start))
Detta återger datum och tid i standardtidszonen (eller om du activate()
en annan tidszon, i aktuell tidszon ).
(*) Notera:Varför du inte ska ge någon mening åt tidszonen som är sparad i din db och bara tänka på det som om det bara är UTC:Om du skulle köra servrar i olika tidszoner kan du faktiskt sluta spara tidsstämplar i olika tidszoner . De är fortfarande alla korrekta (absoluta tidsstämplar) och kan konverteras till vilken annan tidszon som helst. Så i princip är tidszonen som används för att spara meningslös.