サーチ…


前書き

タイムゾーンはしばしば開発者にとって面倒です。 Djangoはタイムゾーンを使いやすくするために、いくつかの素晴らしいユーティリティを用意しています。

プロジェクトが単一のタイムゾーンで運用されている場合でも、データベースにUTCとしてデータを保存して、夏時間のケースを処理することをお勧めします。複数のタイムゾーンで操作している場合、時間データをUTCとして保存する必要があります。

タイムゾーンのサポートを有効にする

最初にまず、 settings.pyファイルでUSE_TZ = Trueを確認しsettings.py 。また、にデフォルトのタイムゾーン値を設定TIME_ZONEなどTIME_ZONE='UTC'ここにタイムゾーンの完全なリストを表示します

場合USE_TZ Falseで、 TIME_ZONE Djangoは、すべての日付時刻を保存するために使用するタイムゾーンになります。ときUSE_TZ有効になっている、 TIME_ZONE Djangoはテンプレート内の日付時刻を表示するために使用されますと、フォームに入力した日付時刻を解釈するために、デフォルトのタイムゾーンです。

タイムゾーンのサポートが有効になっていると、djangoはdatetimeデータをタイムゾーンUTCとしてデータベースに格納します

セッションのタイムゾーンを設定する

Pythonのdatetime.datetimeオブジェクトには、タイムゾーン情報を格納するために使用されるtzinfo属性があります。属性が設定されている場合、そのオブジェクトは認識されているとみなされます。属性が設定されていない場合は、Naiveとみなされます。

タイムゾーンがナイーブであることを確認するには、 .is_naive().is_aware()使用します。

settings.pyファイルにUSE_TZ有効になっている場合、デフォルトのTIME_ZONEsettings.pyされている限り、 datetimeにタイムゾーン情報が付加されsettings.py

このデフォルトのタイムゾーンは、場合によっては良好な場合がありますが、複数のタイムゾーンでユーザーを処理する場合は、特に不十分な場合があります。これを達成するには、ミドルウェアを使用する必要があります。

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)を使用し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を見てください



Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow