Djangoのタイムゾーンを日本に変更の概要
Djangoのプロジェクトを作った際に、タイムゾーンを日本時間にする方法です。
setting.pyでTIME_ZONEの値を変更することで、テンプレートに日付データを渡すと、日本時間にして表示してくれます。
ただ、同じsetting.pyにて、USE_TZ = True としていると、内部的なデータは全てUTCでの保存になります。
時差とかサマータイムのことを考えて、USE_TZ = True で運用するほうが安全そうです。
日本だけのWebサービスだと、複数のタイムゾーンを使用することはあんまりないので、あまり関係ないのですが、複数のタイムゾーンを使用したり、サマータイムの対応だったりがあるときに、時間の取り扱いがおかしなことにならないように、USE_TZ = True がデフォルトになっているようです。
setting.pyでAsia/Tokyoを設定する
test-site │ ├── manage.py │ └── config ├── asgi.py ├── settings.py ├── urls.py ├── wsgi.py └── __init__.py
# Internationalization # https://docs.djangoproject.com/en/3.1/topics/i18n/ LANGUAGE_CODE = 'ja' TIME_ZONE = 'Asia/Tokyo'
TIME_ZONE = の値を変えることで、タイムゾーンを変更できます。
日本の場合はAsia/Tokyoです。
Djangoのadmin管理画面のデータベース項目の日付データを日本時間にする
Djangoでデータベースに日付データを保存する場合は基本UTCで保存されます。
データベースのadmin管理画面に入った時、データベースの各項目を個別に見ると、TIME_ZONEで指定したタイムゾーンで表示されるのですが、項目名として呼び出すときはUTCになります。
これだとすごく見づらいので、ここも日本時間にしたいんですよね。
そういった場合、django.utils.timezoneからlocaltimeを使うことで、日本時間でデータを扱うことができます。
from django.utils import timezone from django.db import models class TestDate(models.Model): test_date = models.DateTimeField('日付') def __str__(self): return '{0}のデータ'.format(timezone.localtime(self.test_date))
モデル内で日付のデータを作っています。このデータをadmin管理画面で文字列を呼びだすために __str__メソッドを使っています。良く使う形です。
自分の環境では、localtimeを使わずに呼ぶと、この__str__で呼んだ表示がUTCになっていました。なので、色々試した結果、localtimeに落ち着きました。
プログラム内で使う場合も、以下のようにlocaltimeを使って時間のデータを呼べば、日本時間で使用できます。
from django.utils import timezone def test(request): now_date = timezone.localtime(timezone.now()) …
まとめ
日本ではあまり時差を気にしないので、タイムゾーンの概念はちょっと厄介です。
内部的にはUTC、テンプレートなどで日付データを呼び出すときはsetting.pyのTIME_ZONEに指定したタイムゾーン、が基本になります。
プログラム内で日付を使わなければ、setting.pyでの設定だけ覚えておけば良いので、そこまで気にする必要もないですが。