Django
Zeitzonen
Suche…
Einführung
Zeitzonen sind für Entwickler oft ein Ärger. Django bietet einige großartige Hilfsprogramme, mit denen Sie die Verwendung von Zeitzonen einfacher gestalten können.
Selbst wenn Ihr Projekt in einer einzigen Zeitzone ausgeführt wird, ist es immer noch ratsam, Daten als UTC-Daten in Ihrer Datenbank zu speichern, um die Sommerzeit zu berücksichtigen. Wenn Sie mit mehreren Zeitzonen arbeiten, ist das Speichern von Zeitdaten als UTC ein Muss.
Aktivieren Sie die Zeitzonenunterstützung
USE_TZ = True
zunächst sicher, dass USE_TZ = True
in Ihrer Datei settings.py
ist. TIME_ZONE
einen Standardwert für die Zeitzone auf TIME_ZONE
z. B. TIME_ZONE='UTC'
. Eine vollständige Liste der Zeitzonen finden Sie hier .
Wenn USE_TZ
False ist, ist TIME_ZONE
die Zeitzone, die Django zum Speichern aller Datumsangaben verwendet. Wenn USE_TZ
aktiviert ist, ist TIME_ZONE
die Standardzeitzone, die Django verwendet, um Datumsangaben in Vorlagen anzuzeigen und in Formularen eingegebene Datumsangaben zu interpretieren.
Wenn die Zeitzonenunterstützung aktiviert ist, speichert datetime
Daten in der Datenbank als UTC
der Zeitzone
Sitzungszeitzonen einstellen
Die datetime.datetime
Objekte von Python datetime.datetime
über ein tzinfo
Attribut, das zum Speichern von Zeitzoneninformationen verwendet wird. Wenn das Attribut gesetzt ist, wird das Objekt als "Aware" betrachtet. Wenn das Attribut nicht festgelegt ist, wird es als "Naive" betrachtet.
Um sicherzustellen, dass eine Zeitzone naiv oder bewusst ist, können Sie .is_naive()
und .is_aware()
Wenn Sie USE_TZ
in Ihrer Datei " settings.py
datetime
haben, werden an eine datetime
Zeitzoneninformationen angehängt, solange Ihr Standardwert TIME_ZONE
in " settings.py
Obwohl diese Standardzeitzone in einigen Fällen gut sein kann, reicht sie wahrscheinlich nicht aus, insbesondere wenn Sie Benutzer in mehreren Zeitzonen verwalten. Um dies zu erreichen, muss Middleware verwendet werden.
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
Es gibt ein paar neue Dinge. Um mehr über Middleware und deren Funktionen zu erfahren, lesen Sie diesen Teil der Dokumentation . In __call__
wir die Einstellung der Zeitzonendaten. Zuerst stellen wir sicher, dass der Benutzer authentifiziert ist, um sicherzustellen, dass für diesen Benutzer Zeitzonen-Daten vorliegen. Sobald wir wissen, dass wir dies tun, aktivieren wir die Zeitzone für die Benutzersitzung mit timezone.activate()
. Um den Zeitzonen-String in etwas umzuwandeln, das von datetime verwendet werden kann, verwenden wir pytz.timezone(str)
.
Wenn jetzt auf datetime-Objekte in Vorlagen zugegriffen wird, werden diese automatisch vom UTC-Format der Datenbank in die Zeitzone des Benutzers konvertiert. Greifen Sie einfach auf das datetime-Objekt zu, und seine Zeitzone wird festgelegt, sofern die vorherige Middleware eingerichtet ist richtig.
{{ my_datetime_value }}
Wenn Sie eine genaue Kontrolle darüber wünschen, ob die Zeitzone des Benutzers verwendet wird, sehen Sie sich Folgendes an:
{% 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 %}
Beachten Sie, dass diese beschriebene Methode nur in Django 1.10 und mehr funktioniert. Um Django von vor 1.10 zu unterstützen, schauen Sie in MiddlewareMixin nach