本記事ではdjangoの
- timezoneを日本時間に変更する方法
- timezoneを日本以外の時間にする方法
を解説していきます。
djangoではデータベース上で時間を取り扱う場合があります。
その時間はタイムゾーンで設定していきます。
そのタイムゾーンを日本時間にする方法や日本以外にする方法を解説していきます。
timezoneの設定部分
djangoのtimezoneの設定を行う部分を解説していきます。
djangoのtimezoneの設定はsettings.pyで行います。
settings.pyの部分はいろいろなパラメータがあり、ややこしい部分です。
ですが、settings.pyの下の方にtimezoneを設定する部分はあります。
# Internationalization
# https://docs.djangoproject.com/en/3.0/topics/i18n/
LANGUAGE_CODE = 'en-us'
TIME_ZONE = 'UTC'
USE_I18N = True
USE_L10N = True
USE_TZ = True
# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/3.0/howto/static-files/
STATIC_URL = '/static/'
USE_TZ = Trueにする
ここの USE_TZ は USE_TZ = True とします。
このUSE_TZをFalseにした場合、時刻はすべて日本時間として保存されます。
しかし、デメリットは非常に大きくなります。
各国の標準時間に合わせるのに一とつずつ設定しなければなりません。
また、サマータイムに関しても自動で設定されず、開発者の方で設定しなければならないため、工数が非常に莫大になります。
そのため、USE_TZ = Trueで設定しましょう。
時刻は日本時間ではなく、UTC (Coordinated Universal Time:協定世界時)になります。
この場合はローカルタイムへの変換が必要ですが、USE_TZ = Falseにした場合の工数よりも手間は比較的少なくなります。
TIME_ZONE = ‘Asia/Tokyo’
次の設定としてsettings.pyのTIME_ZONEを「Asia/Tokyo」に変えましょう。
これでタイムゾーンは日本時間として設定できます。
また、ここのTIME_ZONEは「JAPAN」でも同じ日本時間になります。
なぜ同じになるかというと、ここのTIME_ZONEの設定できる場所は複数あります。
また、同じ場所を複数の書き方でタイムゾーンを設定できます。
Asia/TokyoもJAPANも書き方が異なりますが、同じ日本時間を示します。
さて、では実際にTIMEZONEを変更することで何がどう変わるか確認してみましょう。
TIME_ZONEを変更する影響
テンプレート{% now %}による出力
まずは、テンプレートタグの{% now %}の出力です。
このテンプレートタグは現在の日付や時刻を出力します。
ただし、フォーマット文字列が必要になります。
そのため、出力させるには以下の例のように書きましょう。
# 現在の日付と時刻を表示させます。
# ちなみに現日時は2021年12月11日10:37です。
{% now "Y年m月d日 H:i:s" %}
これによって、出力には以下のようになります。

ちなみに日付と時刻を表示させるフォーマットの詳細は以下のURLに載ってあります。

DBに保存する時間はUTCになる
ここで一つ注意があります。
フォームなどからDBに保存される時間はUTCを基準とされます。
つまり、日本時間の10:37で保存したとしても、1:37になってしまいます。(UTCに対して日本時間は+9時間のため。)
たとえば、adminのフォームから以下のように同じ時間を入力してDB上に保存される時間を確認すると以下のようになります。
>> datetime.datetime(2021, 12, 11, 1, 37, 34, tzinfo=<UTC>)
これだと日本時間から9時間遅れた時間が表示されてしまいます。
tzinfo=<UTC>の表示もタイムゾーンの情報をUTCとして持っていることを示しています。
では、日本時間で出力するようにしましょう。
日本時間にするにはlocaltimeを使って出力するようにします。以下のような形です。
from models import Sample
from django.utils import timezone
original_time = Sample.objects.get(pk=1).time
print('DB_original_time:',original_time)
>>> DB_original_time: 2021-12-11 01:37:34+00:00
local_time = timezone.localtime(original_time)
print('DB_localtime:', local_time)
>>> DB_localtime: 2021-12-11 10:37:34+09:00
これで出力を日本時間に変更することができました。
日本以外のタイムゾーンの表示方法
日本以外のタイムゾーンに変更する方法について解説します。
といっても、日本以外のタイムゾーンにするにはsettings.pyのTIME_ZONEを変更するしかありません。
現在がTIME_ZONE = ‘Asia/Tokyo’か‘JAPAN’になっているかと思います。
この部分を他の地域に変更するだけです。
ちなみに、他の地域はたくさんあり、適切な書き方をしなければなりません。
その時に、他にどのような書き方があるかを地域ごとにまとめた以下の記事が使えると思います。
非常に量が多いですが、参考にどうぞ。
今回の記事は以上です。