Zoeken…


Invoering

Tijdzones zijn vaak een gedoe voor ontwikkelaars. Django biedt een aantal geweldige hulpprogramma's tot uw beschikking om tijdzones gemakkelijk te maken om mee te werken.

Zelfs als uw project in een enkele tijdzone werkt, is het nog steeds een goede gewoonte om gegevens als UTC in uw database op te slaan om gevallen van zomertijd aan te kunnen. Als u op meerdere tijdzones werkt, is het opslaan van tijdgegevens als UTC een must.

Tijdzone-ondersteuning inschakelen

Eerst komt eerst, zorg ervoor dat USE_TZ = True in uw bestand settings.py . Stel ook een standaardwaarde voor de tijdzone in op TIME_ZONE zoals TIME_ZONE='UTC' . Bekijk een volledige lijst van tijdzones hier .

Als USE_TZ False is, is TIME_ZONE de tijdzone die Django zal gebruiken om alle TIME_ZONE op te slaan. Wanneer USE_TZ is ingeschakeld, is TIME_ZONE de standaardtijdzone die Django zal gebruiken om datetijden in sjablonen weer te geven en om TIME_ZONE te interpreteren die zijn ingevoerd in formulieren.

Als tijdzone-ondersteuning is ingeschakeld, slaat django datetime gegevens in de database op als de tijdzone UTC

Sessietijdzones instellen

Python's datetime.datetime objecten hebben een tzinfo kenmerk dat wordt gebruikt om tijdzone-informatie op te slaan. Wanneer het attribuut is ingesteld, wordt het object als Bewust beschouwd, wanneer het attribuut niet wordt ingesteld, wordt het als Naïef beschouwd.

Om ervoor te zorgen dat een tijdzone naïef of bewust is, kunt u .is_naive() en .is_aware()

Als USE_TZ ingeschakeld in uw bestand settings.py , wordt aan een datetime tijdzone-informatie gekoppeld zolang uw standaard TIME_ZONE is ingesteld in settings.py

Hoewel deze standaardtijdzone in sommige gevallen goed kan zijn, is dit waarschijnlijk niet voldoende, vooral als u gebruikers in meerdere tijdzones behandelt. Om dit te bereiken, moet middleware worden gebruikt.

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

Er zijn een paar nieuwe dingen aan de hand. Bekijk dat deel van de documentatie voor meer informatie over middleware en wat het doet. In __call__ we de instelling van de tijdzonegegevens. In eerste instantie zorgen we ervoor dat de gebruiker wordt geverifieerd, om ervoor te zorgen dat we tijdzonegegevens voor deze gebruiker hebben. Zodra we weten dat we dat doen, activeren we de tijdzone voor de gebruikerssessie met timezone.activate() . Om de tijdzonereeks te converteren naar iets dat bruikbaar is door datetime, gebruiken we pytz.timezone(str) .

Wanneer nu datetime-objecten in sjablonen worden benaderd, worden ze automatisch geconverteerd van het 'UTC'-formaat van de database naar de tijdzone waarin de gebruiker zich bevindt. Ga gewoon naar het datetime-object en de tijdzone wordt ingesteld, ervan uitgaande dat de vorige middleware is ingesteld naar behoren.

{{ my_datetime_value }}

Als u een nauwkeurige controle wenst over het gebruik van de tijdzone van de gebruiker, kijk dan naar het volgende:

{% 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 %}

Let op, deze beschreven methode werkt alleen in Django 1.10 en hoger. Om django van vóór 1.10 te ondersteunen, kijk in MiddlewareMixin



Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow