設定會話時區

Python 的 datetime.datetime 物件具有 tzinfo 屬性,用於儲存時區資訊。設定屬性時,物件被視為 Aware,當未設定屬性時,它被視為 Naive。

為確保時區天真或有意識,你可以使用 .is_naive().is_aware()

如果你的 settings.py 檔案中啟用了 USE_TZ,只要你的預設 TIME_ZONE 設定在 settings.py 中,datetime 就會附加時區資訊

雖然此預設時區在某些情況下可能會很好,但可能還不夠,尤其是在處理多個時區的使用者時。為了實現這一點,必須使用中介軟體。

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

還有一些新事物正在發生。要了解有關中介軟體及其功能的更多資訊,請檢視該部分文件 。在 __call__ 中,我們正在處理時區資料的設定。首先,我們確保使用者已通過身份驗證,以確保我們為此使用者提供時區資料。一旦我們知道了,我們就會使用 timezone.activate() 為使用者會話啟用時區。為了將時區字串轉換為 datetime 可用的時區,我們使用 pytz.timezone(str)

現在,當在模板中訪問 datetime 物件時,它們將自動從資料庫的 UTC 格式轉換為使用者所在的任何時區。只需訪問 datetime 物件,並假設先前的中介軟體已設定,將設定其時區正常。

{{ my_datetime_value }}

如果你希望對使用者的時區是否使用進行細粒度控制,請檢視以下內容:

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

注意,此方法描述僅適用於 Django 1.10 及更高版本。要從 1.10 之前支援 django,請檢視 MiddlewareMixin