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を見てください