PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Pare de traduzir os tempos do Django para UTC


Você está interpretando isso de forma errada. O banco de dados armazena um horário UTC na maioria das vezes. Se você usa PostgreSQL, o banco de dados pode armazenar uma hora com informações de fuso horário, mas para fins práticos (*) é mais fácil pensar que a hora em seu banco de dados é armazenada como UTC (ou seja, como uma hora absoluta que pode ser convertida para qualquer hora zona) quando USE_TZ = True . Ele sempre representa um ponto correto no tempo para o qual você não precisa lembrar ou assumir nenhum fuso horário. E até onde eu sei, o Django sempre armazenará a hora com reconhecimento de tempo no fuso horário UTC.

Então, quando você está buscando o objeto de tempo usando select em psql , você está retornando a hora no fuso horário local da sua máquina (o fuso horário em que você está executando o psql). Se alguém em "America/New_York" executasse a mesma consulta de seleção, ela veria um timestamp -04. Se a data fosse 20-03-2019, você teria visto 2019-03-20 10:50:00+00 porque naquela data, Europa/Londres e UTC eram os mesmos.

Ao buscar o valor de um DateTimeField como um python datetime.datetime objeto, o Django sempre busca o valor UTC, porque:

Isso facilita o trabalho com esses objetos de data e hora em seu código python:eles são sempre horários UTC.

Se você quiser imprimir esses valores em um PDF, use os mesmos métodos que o Django usa para a renderização do template:
from django.utils import timezone
print(timezone.template_localtime(Booking.objects.get(pk=280825).start))

Isso renderiza a data e hora no fuso horário padrão (ou se você activate() um fuso horário diferente, no fuso horário atual ).

(*) Nota:Por que você não deve dar nenhum significado ao fuso horário salvo em seu banco de dados e apenas pensar nisso como se fosse tudo UTC:Se você executar servidores em vários fusos horários, poderá acabar salvando carimbos de data e hora em diferentes fusos horários . Eles ainda estão todos corretos (timestamps absolutos) e podem ser convertidos para qualquer outro fuso horário. Então, basicamente, o fuso horário usado para salvar não tem sentido.