PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Arrêtez Django de traduire les heures en UTC

Vous interprétez cela mal. La base de données stocke une heure UTC la plupart du temps. Si vous utilisez PostgreSQL, la base de données peut stocker une heure avec des informations sur le fuseau horaire, mais pour des raisons pratiques (*), il est plus simple de penser que l'heure dans votre base de données est stockée au format UTC (c'est-à-dire en tant qu'heure absolue pouvant être convertie à tout moment zone) lorsque USE_TZ = True . Il représente toujours un moment correct pour lequel vous n'avez pas besoin de vous souvenir ou d'assumer un fuseau horaire. Et pour autant que je sache, Django stockera toujours l'heure en fonction de l'heure dans le fuseau horaire UTC.

Ainsi, lorsque vous récupérez l'objet de temps en utilisant select en psql , vous récupérez l'heure dans le fuseau horaire local de votre machine (le fuseau horaire dans lequel vous exécutez psql). Si quelqu'un dans "America/New_York" exécutait la même requête de sélection, il verrait un horodatage -04. Si la date avait été le 2019-03-20, vous auriez vu 2019-03-20 10:50:00+00 car à cette date, Europe/Londres et UTC étaient identiques.

Lors de la récupération de la valeur d'un DateTimeField en tant que python datetime.datetime objet, Django récupère toujours la valeur UTC, car :

Cela facilite le travail avec ces objets datetime dans votre code python :ce sont toujours des heures UTC.

Si vous souhaitez imprimer ces valeurs dans un PDF, utilisez les mêmes méthodes que Django utilise pour le rendu du modèle :

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

Cela rend la date et l'heure dans le fuseau horaire par défaut (ou si vous activate() un fuseau horaire différent, dans le fuseau horaire actuel ).

(*) Remarque :pourquoi vous ne devriez pas donner de sens au fuseau horaire enregistré dans votre base de données et y penser comme si tout était UTC :si vous deviez exécuter des serveurs dans différents fuseaux horaires, vous pourriez en fait finir par enregistrer des horodatages dans différents fuseaux horaires . Ils sont toujours tous corrects (horodatages absolus) et peuvent être convertis dans n'importe quel autre fuseau horaire. Donc, fondamentalement, le fuseau horaire utilisé pour l'enregistrement n'a pas de sens.