PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Interrompi la traduzione degli orari di Django in UTC

Lo stai interpretando male. Il database memorizza un'ora UTC per la maggior parte del tempo. Se usi PostgreSQL, il database può memorizzare un'ora con informazioni sul fuso orario, ma per scopi pratici (*) è più semplice pensare che l'ora nel tuo db sia memorizzata come UTC (cioè come ora assoluta che può essere convertita in qualsiasi momento zona) quando USE_TZ = True . Rappresenta sempre un momento corretto per il quale non è necessario ricordare o assumere alcun fuso orario. E per quanto ne so, Django memorizzerà sempre l'ora come sensibile all'ora nel fuso orario UTC.

Quindi, quando stai recuperando l'oggetto tempo usando select in psql , stai recuperando l'ora nel fuso orario locale della tua macchina (il fuso orario in cui stai eseguendo psql). Se qualcuno in "America/New_York" eseguisse la stessa query di selezione, vedrebbe un timestamp -04. Se la data fosse stata il 20-03-2019, avresti visto 2019-03-20 10:50:00+00 perché in quella data Europa/Londra e UTC erano gli stessi.

Quando si recupera il valore di un DateTimeField come python datetime.datetime oggetto, Django recupera sempre il valore UTC, perché:

Ciò semplifica il lavoro con questi oggetti datetime nel tuo codice Python:sono sempre orari UTC.

Se vuoi stampare questi valori in un PDF, usa gli stessi metodi usati da Django per il rendering del modello:

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

Questo rende il datetime nel fuso orario predefinito (o se activate() un fuso orario diverso, nel fuso orario corrente ).

(*) Nota:perché non dovresti dare alcun significato al fuso orario salvato nel tuo db e pensarci come se fosse tutto UTC:se dovessi eseguire server in vari fusi orari, potresti effettivamente finire per salvare timestamp in fusi orari diversi . Sono ancora tutti corretti (timestamp assoluti) e possono essere convertiti in qualsiasi altro fuso orario. Quindi, in pratica, il fuso orario utilizzato per il salvataggio non ha significato.