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



Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow