【Django】テンプレート:日付の表示形式を変更(フォーマット)する(dateフィルタ)

時計 2021.06.21 / 時計

【Django】テンプレート:日付の表示形式を変更(フォーマット)する(dateフィルタ)

本記事では、Djangoテンプレートで使用する組み込みフィルタのうち、dateフィルタによる日付の表示形式を変更する方法(フォーマット)について解説していきます。

Djangoには様々な組み込みフィルタが用意されています。
その中でもdateフィルタは使用頻度が高い組み込みフィルタの一つです。

本記事を通して、日付データを望んだ書式フォーマットに変更して、テンプレートに表示できるようになりましょう。

組み込みフィルタ

Djangoには、初めからテンプレート上で使用できる組み込みフィルタが存在します。

組み込みフィルタを使用することで、views.pyからテンプレートに送られた変数を操作することができます。

組み込みフィルタはテンプレートファイル(htmlファイル)内で次のように使用します。

{{ 変数名 | 組み込みフィルタ: '引数' }}

組み込みフィルタには様々な種類があります。
変数に値を加算するものや、変数から文字列を削除するものなど様々です。

本記事では日付データを指定した形式にフォーマットする組み込みフィルタを解説しています。

テンプレート:日付の表示形式を変更する(フォーマット)

日付:デフォルトの表示

テンプレートでdate形式データを出力すると以下のような出力になります。

May 4, 2021

テンプレート上で表示する日付がこの表示形式では困ることが多々あります。
例えばinputタグにデータベースの日付データを挿入したいときに、別のフォーマットで入れたい時です。

組み込みフィルタ:date

組み込みフィルタのdateを使用することでdate形式の日付データをフォーマットすることが可能です。

{{ today|date:"Y-m-d" }}

上記では変数todayに対してdateフィルタを使い、年-月-日の形式にフォーマットしています。

このようにdateフィルタでは、引数で指定した書式でdate形式の日付データをフォーマットします。

ここで言っているdate形式の日付データとは下記に示すクラスのデータです。

  • django.db.models.DateTimeField/DateField
  • datetime.datetime
  • datetime.date

引数で使用できるフォーマット文字は多くの種類がありますので、次項で示す一覧から利用したいものを選んで使ってください。

組み込みフィルタdateのフォーマット文字:一覧

下記にdateフィルタで使用するフォーマット文字一覧を記します。
これらフォーマット文字を用いて引数に書式を指定します。

フォーマット文字 単位 意味 出力例
Y 年を4桁表示 2021
y 年を2桁表示 21
L うるう年の判定 TrueまたはFalse
m 月を2桁表示(ゼロで埋める) 01~31
n 月を数値で表示(ゼロで埋めない) 1~31
b 月を英語で3文字表示(小文字) jan
M 月を英語で3文字表示(頭文字のみ大文字) Jan
F 月を英語で表示 January
N 月を英語で表示(省略形) Jan. Feb. March
d 日を2桁表示(ゼロで埋める) 01~31
j 日を数値で表示(ゼロで埋めない) 1~31
z 年単位での日を表示 0~365
S 日の英語表記時の接尾辞 st、nd、rd、th
t 月の日数 28~31
D 曜日 曜日を英語で3文字表示 Mon
I 曜日 曜日を英語で表示 Monday
w 曜日 曜日を数値で表示 0(日曜)~6(土曜)
W 曜日 年間の週番号 1、54
a 午前午後 a.m.またはp.m. a.m.
A 午前午後 AMまたはPM AM
h 時間を12時間表示(ゼロで埋める) 01~12
H 時間を24時間表示(ゼロで埋める) 00~23
g 時間を12時間表示(ゼロで埋めない) 1~12
G 時間を24時間表示(ゼロで埋めない) 1~23
i 分を表示 00~59
f 時分 時間(12時間表示)と分を表示 5:54
P 時分 時間(12時間表示)と分と午前午後を表示 5:54 a.m.
s 秒を数字で2桁表示 00~59

テンプレート:日付のフォーマット例

Webアプリケーションに組み込みフィルタdateを使った例を以下に記します。

まずはviews.pyでデータベース(モデル)からデータを取得し、それをテンプレートに渡します。

# views.py
def data_list(request):
    datas = Data.objects.all()
    context = {'datas':datas, }
    return render(request, 'data_list.html', context)

上記ではDataモデルからすべてのデータを取得し、変数datasに格納してテンプレートdata_list.htmlに渡しています。

次にテンプレートで受け取ったdatasから、created_at(保存した日付)を表示してみます。

# data_list.html
{% for data in datas %}
    {{ data.created_at }}
{% endfor %}

このままでも日付データを表示することができますが、組み込みフィルタdateを使って書式フォーマットを変更してみます。

{{ data.created_at|date:"Y M d D" }}

上記では出力が2021 Jul 21 Monとなります。

時間も含めた表記にしたいときは次のようにします。

{{ data.created_at|date:"y/n/j H:i:s" }}

上記では出力が21/6/21 15:54:54となります。

日時のタイムゾーン変更

ご存じの通り、Webアプリケーションのタイムゾーンはsettings.pyで設定されています。

# settings.py
TIME_ZONE = 'Asia/Tokyo'

日本で使うWebアプリケーションでは上記の設定を記載して、JST(日本標準時刻)にしているはずです。

このタイムゾーンをテンプレートで表示する日時に対してUTC(協定世界時)に変更したい場合は、下記のようにlocaltimeを使います。

{% localtime off %}
    {{ data.created_at|date:"y/n/j H:i:s" }}
{% endlocaltime %}}

まとめ

本記事「【Django】テンプレート:日付の表示形式を変更(フォーマット)する(dateフィルタ)」はいかがでしたか。

今回はDjangoのテンプレートで頻繁に使用する組み込みフィルタのうちdateについて解説しました。

dateフィルタを使いこなして、テンプレートに表示する日時を自在にフォーマットしてみてください。