Django

Djangoのタイムゾーンを日本に変更。setting.pyのTIME_ZONEをAsia/Tokyoに。

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です。

TIME_ZONEは表示の時のタイムゾーン。内部的にはUTCで保存されている

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での設定だけ覚えておけば良いので、そこまで気にする必要もないですが。

タイトルとURLをコピーしました