MTのテンプレート処理で異なる日付間の日単位の差分を取得する(うるう年対応)の試み

投稿日: 更新日:

MTの日付取得タグはうるう年を考慮しているのか(=グレゴリオ暦に対応してるのか)

閏年(=うるう年)とは

普通1年は当然365日だが、閏年には、1日(=閏日)を加算して、1年が366日になる。

まず前提として、暦はいくつか種類があり、世界中で使われているのは「グレゴリオ暦」。
日本もグレゴリオ暦の計算法に準じる形で閏年を計算するよう、法令で定められている(明治三十一年勅令第九十号(閏年ニ関スル件))。

具体的な閏年の計算法は、次の通り(※1より引用)。

(1)西暦年号が4で割り切れる年をうるう年とする。
(2)(1)の例外として、西暦年号が100で割り切れて400で割り切れない年は平年とする。

検証

MTDateタグとtsモディファイア、およびformat="%j" を使って、年初からの起算日数を比較するコードを用意し、インデックステンプレートで再構築してみる。

<pre>
「1)西暦年号が4で割り切れる年をうるう年とする」に準拠してるか:
2019/03/01の年初からの起算日数:<mt:date ts="20190301000000" format="%j" />
2020/03/01の年初からの起算日数:<mt:date ts="20200301000000" format="%j" />

「2)(1)の例外として、西暦年号が100で割り切れて400で割り切れない年は平年とする。」に準拠してるか:
2020/03/01の年初からの起算日数:<mt:date ts="20200301000000" format="%j" />
2100/03/01の年初からの起算日数:<mt:date ts="21000301000000" format="%j" />
</pre>

結果、次の様に出力される。

「1)西暦年号が4で割り切れる年をうるう年とする」に準拠してるか:
2019/03/01の年初からの起算日数:060
2020/03/01の年初からの起算日数:061

「2)(1)の例外として、西暦年号が100で割り切れて400で割り切れない年は平年とする。」に準拠してるか:
2020/03/01の年初からの起算日数:061
2100/03/01の年初からの起算日数:060

本結果より、MTのdate系タグはうるう年を考慮していると判断する。

異なる日付間の日単位の差分を取得するコード

前述の結果を元に、次のようなコードを組む。
なお、日付間の差分が4年以上の場合は、ロジックが複雑になるので対応してない><

<mt:ignore>2つの異なる年月日の差分(日単位)を求める。</mt:ignore>
<mt:setvartemplate name="tmpl__date_distance">
<mt:date ts="$prm__date_a" format="%Y" setvar="date__yyyy__current" />
<mt:date ts="$prm__date_a" format="%j" setvar="date__j__current" />
<mt:var name="date__yyyy__current" op="*" value="365" setvar="date__yyyy__current" />
<mt:var name="date__yyyy__current" op="+" value="$date__j__current" setvar="date__compare__current" >
<mt:date ts="$prm__date_b" format="%Y" setvar="date__yyyy__entry" />
<mt:date ts="$prm__date_b" format="%j" setvar="date__j__entry" />
<mt:var name="date__yyyy__entry" op="*" value="365" setvar="date__yyyy__entry" />
<mt:var name="date__yyyy__entry" op="+" value="$date__j__entry" setvar="date__compare__entry" >
<mt:var name="date__compare__current" op="-" value="$date__compare__entry" setvar="rtn__date__distance" >
</mt:setvartemplate>
<mt:ignore>/2つの異なる年月日の差分(日単位)を求める。</mt:ignore>

<mt:date ts="20190301000000" setvar="prm__date_b" />
<mt:date ts="20200301000000" setvar="prm__date_a" />
<mt:var name="tmpl__date_distance" />
<pre>
2019/03/01の年初からの起算日数:<mt:date ts="20190301000000" format="%j" />
2020/03/01の年初からの起算日数:<mt:date ts="20200301000000" format="%j" />
日付間の差分:<mt:var name="rtn__date__distance" />

※注)日付間の差分が4年以上の場合には非対応。
</pre>

上述サンプルコードの実施結果は次の通り。

2019/03/01の年初からの起算日数:060
2020/03/01の年初からの起算日数:061
日付間の差分:366

※注)日付間の差分が4年以上の場合には非対応。

参考

※1 質問3-6)どの年がうるう年になるの? | 国立天文台(NAOJ)
https://www.nao.ac.jp/faq/a0306.html

関連するタグ

関連するタグは現在ありません。