Bienvenue sur IndexError.

Ici vous pouvez poser des questions sur Python et le Framework Django.

Mais aussi sur les technos front comme React, Angular, Typescript et Javascript en général.

Consultez la FAQ pour améliorer vos chances d'avoir des réponses à vos questions.

UTC avec django et base de données

+5 votes

Si django est configuré pour utiliser la timezone UTC, dois-je configurer postgresql pour utiliser aussi UTC ?

demandé 28-Jun-2015 par oyoun (132 points)
edité 28-Jun-2015 par boblinux
  1. Je me suis permis de modifier ta question pour virer le "salut", en
    effet sur IE on préfère aller droit au but et délaisser les paroles
    futiles (du genre bonjour, merci etc...) =D

  2. Sinon par rapport à ta question, tu devrais aller jeter un coup
    d'oeil par ici , notamment le passage :

Python’s datetime.time objects also feature a tzinfo attribute, and
PostgreSQL has a matching time with time zone type. However, as
PostgreSQL’s docs put it, this type “exhibits properties which lead to
questionable usefulness”.

Django only supports naive time objects and will raise an exception if
you attempt to save an aware time object, as a timezone for a time
with no associated date does not make sense.

et aussi par là :

PostgreSQL¶

The PostgreSQL backend stores datetimes as timestamp with time zone.
In practice, this means it converts datetimes from the connection’s
time zone to UTC on storage, and from UTC to the connection’s time
zone on retrieval.

As a consequence, if you’re using PostgreSQL, you can switch between
USETZ = False and USETZ = True freely. The database connection’s
time zone will be set to TIME_ZONE or UTC respectively, so that Django
obtains correct datetimes in all cases. You don’t need to perform any
data conversions.

Ps : j'ai la flemme de traduire il est 4 h du mat ;)
Pss : excuse mon manque de développement dans le com's mais j'ai (presque) jamais encore touché à django ;P

Je pensais que le message était ironique, c'est pour ça que j'ai dis Salut. :D

J'explique un peu le projet sur lequel je travail... Des utilisateurs canadiens et français vont être amenés à utiliser l'application.

Actuellement mon settings.py est configuré pour avoir en timezone = 'America/Montreal' et postgresql en UTC. Cette configuration fonctionne bien. Quand je vais voir les enregistrements en base de données. Je vois qu'ils sont transformé en UTC. 2015-06-28 19:00:00 me donne bien 2015-06-28 23:00:00

Or quand je mets les deux configurations en UTC, je trouve ça louche.
Exemple: si je rentre la date: 2015-06-28 19:00:00, je retrouverai le meme enregistrement en base de données alors que je m'attends à avoir 23H00 ...
J'ai l'impression que lorsque les deux sont UTC, l'applicatif pense que je rentre déjà des données en UTC...

Etant donné qu'il y aura qu'un seul serveur pour les Canadiens et Français, quelle est la meilleure solution? Sinon dans les vues django, je peux récuperer la timezone de l'utilisateur et joué avec ... Je pense que ça fera l'affaire ?
Sinon quand les Français enregistrement des données, ça utilisera la timezone de Montreal ... :/

1 Réponse

+6 votes
 
Meilleure réponse

comme indiqué par boblinux avec la doc, il n'y a rien à faire pour convertir quoique se soit qui soit stocké dans la base PostgreSQL, USE_TZ s'en charge.

En version française ca donne :

https://docs.djangoproject.com/fr/1.8/topics/i18n/timezones/

Par contre pour l'affichage des dates selon un Français ou un Canadien il faut simplement, transformer la date UTC provenant de la base de données en version "local" soit avec arrow

arrow.get(ma_date).to(mon_user.fuseau_horaire)

perso je fais dans mon appli

arrow.get(ma_date).to(settings.TIME_ZONE)

par exemple pour avoir la date & heure du jour en UTC

now = arrow.utcnow().to(settings.TIME_ZONE)

ou

now = arrow.utcnow().to(mon_user.fuseau_horaire)

mais il faut bien que tout soit en UTC sinon on va melanger choux et carottes

répondu 29-Jun-2015 par foxmask (2,888 points)
sélectionné 14-Mai-2016 par Sam

Le problème est résolu.

Arrow est vraiment une lib geniale.

Merci :)

N'hésitez pas à valider la réponse qui vous a aide afin que les suivants sachent quelle fut la solution

Peut-on voter pour un commentaire ?

Nope, seulement pour les réponses.

...