Django
Tijdzones
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