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



Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow