Django
時間帯
サーチ…
前書き
タイムゾーンはしばしば開発者にとって面倒です。 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_ZONE
がsettings.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を見てください