Django
Fuseaux horaires
Recherche…
Introduction
Les fuseaux horaires sont souvent un problème pour les développeurs. Django met à votre disposition de nombreux utilitaires pour faciliter la collaboration avec les fuseaux horaires.
Même si votre projet fonctionne dans un seul fuseau horaire, il est toujours recommandé de stocker les données sous forme de temps UTC dans votre base de données pour gérer les cas d’heure avancée. Si vous travaillez sur plusieurs fuseaux horaires, le stockage des données horaires sous forme de temps UTC est indispensable.
Activer le support de fuseau horaire
Tout d'abord, assurez-vous que USE_TZ = True
dans votre fichier settings.py
. TIME_ZONE
également une valeur de fuseau horaire par défaut sur TIME_ZONE
par exemple TIME_ZONE='UTC'
. Afficher une liste complète des fuseaux horaires ici .
Si USE_TZ
False, TIME_ZONE
sera le fuseau horaire que Django utilisera pour stocker toutes les datetimes. Lorsque USE_TZ
est activé, TIME_ZONE
est le fuseau horaire par défaut que Django utilisera pour afficher les datetimes dans les modèles et pour interpréter les dathale saisies dans les formulaires.
Avec la prise en charge du fuseau horaire activée, django stockera les données datetime
dans la base de données en tant que UTC
horaire UTC
Définition des fuseaux horaires de session
Les objets datetime.datetime
de Python ont un attribut tzinfo
utilisé pour stocker les informations de fuseau horaire. Lorsque l'attribut est défini, l'objet est considéré comme Aware, lorsque l'attribut n'est pas défini, il est considéré comme une Naive.
Pour vous assurer qu'un fuseau horaire est naïf ou conscient, vous pouvez utiliser .is_naive()
et .is_aware()
Si USE_TZ
activé dans votre fichier settings.py
, une datetime
heure sera associée à des informations de fuseau horaire tant que votre TIME_ZONE
par défaut est défini dans settings.py
Bien que ce fuseau horaire par défaut puisse être bon dans certains cas, il est probable que cela ne soit pas suffisant, surtout si vous manipulez des utilisateurs dans plusieurs fuseaux horaires. Pour ce faire, le middleware doit être utilisé.
import pytz
from django.utils import timezone
# make sure you add `TimezoneMiddleware` appropriately in settings.py
class TimezoneMiddleware(object):
"""
Middleware to properly handle the users timezone
"""
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
# make sure they are authenticated so we know we have their tz info.
if request.user.is_authenticated():
# we are getting the users timezone that in this case is stored in
# a user's profile
tz_str = request.user.profile.timezone
timezone.activate(pytz.timezone(tz_str))
# otherwise deactivate and the default time zone will be used anyway
else:
timezone.deactivate()
response = self.get_response(request)
return response
Il y a quelques nouvelles choses qui se passent. Pour en savoir plus sur le middleware et sur son contenu, consultez cette partie de la documentation . Dans __call__
nous __call__
le paramétrage des données de fuseau horaire. Au début, nous nous assurons que l'utilisateur est authentifié, pour s'assurer que nous avons des données de fuseau horaire pour cet utilisateur. Une fois que nous savons que nous le faisons, nous activons le fuseau horaire pour la session des utilisateurs en utilisant timezone.activate()
. Pour convertir la chaîne de fuseau horaire en quelque chose utilisable par datetime, nous utilisons pytz.timezone(str)
.
Désormais, lorsque les objets datetime sont accessibles dans les modèles, ils seront automatiquement convertis du format 'UTC' de la base de données vers le fuseau horaire de l'utilisateur. Accédez simplement à l'objet datetime et son fuseau horaire correctement.
{{ my_datetime_value }}
Si vous souhaitez un contrôle précis de l'utilisation du fuseau horaire de l'utilisateur, consultez les éléments suivants:
{% load tz %}
{% localtime on %}
{# this time will be respect the users time zone #}
{{ your_date_time }}
{% endlocaltime %}
{% localtime off %}
{# this will not respect the users time zone #}
{{ your_date_time }}
{% endlocaltime %}
Notez que cette méthode décrite ne fonctionne que dans Django 1.10 et suivants. Pour supporter django avant 1.10 regardez dans MiddlewareMixin