開発情報・ナレッジ

投稿者:SPIRERS ナレッジ向上チーム 2022年11月9日 (水)

Thymeleaf で日時/日付/月日/時刻 フィールドを扱う方法まとめ

SPIRAL ver.2 のサイト管理での日付操作をまとめました。
レコード値、認証値や引用値などは、Thymeleaf で出力を行うため、出力方法や比較など日付を操作したい場合の参考にしてください。

レコード値の 日付/月日/時刻 フィールドの値を分解して表示する方法

レコードリスト・レコードアイテム にて、
日付フィールドで年月のみ表示を行いたい や 月日フィールドで月のみ使用する場合の方法です。

日付
<!-- 年のみ表示 -->       
<p th:text="|${record['f0x'].format('yyyy')}年|"></p>

<!-- 月のみ表示 -->       
<p th:text="|${record['f0x'].format('MM')}月|"></p>

<!-- 日のみ表示 -->       
<p th:text="|${record['f0x'].format('dd')}日|"></p>

<!-- 年月のみ表示 -->       
<p th:text="|${record['f0x'].format('yyyy')}年 ${record['f0x'].format('MM')}月|"></p>
月日
<!-- 月のみ表示 -->       
<p th:text="|${record['f0x'].format('MM')}月|"></p>

<!-- 日のみ表示 -->       
<p th:text="|${record['f0x'].format('dd')}日|"></p>
時刻
<!-- 時のみ表示 -->       
<p th:text="|${record['f0x'].format('HH')}時|"></p>

<!-- 分のみ表示 -->       
<p th:text="|${record['f0x'].format('mm')}分|"></p>

<!-- 秒のみ表示 -->       
<p th:text="|${record['f0x'].format('ss')}秒|"></p>

<!-- 時分のみ表示 -->       
<p th:text="|${record['f0x'].format('HH')}時 ${record['f0x'].format('mm')}分|"></p>

日時フィールド / 日付フィールドから曜日の表示する方法

レコードリスト・レコードアイテムで日時フィールド / 日付フィールドの値を元に曜日を表示する方法です。
<span th:with="week=${ { '', '日', '月', '火', '水', '木', '金', '土' } }" th:text="${record['f0xx'] != null} ? ${record['f0xx'].format('yyyy/MM/dd')} + |(${week[record['f0xx'].format('e')]})| : ''">2000/01/01(水)</span>
format('e') にて、曜日を数字形式で返してくれるので、
week の変数に曜日を持たせて一致する値の曜日を表示する仕組みとなります。
英語表記の曜日を出す方法は下記です。
<span th:text="${record['f0xx'] != null} ? | ${record['f0xx'].format('yyyy/MM/dd(E)')} | : ''">2000/01/01(Wed)</span>
format('yyyy/MM/dd HH:mm:ss') の「yyyy/MM/dd HH:mm:ss」の部分は、表示させたい状態にカスタマイズできます。
年月日時分秒 で表示させたい場合、「yyyy年MM月dd日 HH時mm分ss秒」と記載することで 年月日時分秒 形式で表示されます。
また、「秒」では不要な場合などは、「yyyy/MM/dd HH:mm」と 不要な箇所を削除することで不要部分は非表示にすることができます。
※ format() は、認証レコード値では、使用できないのでご注意ください。

日付を比較

レコードリスト・レコードアイテム では日付による比較が可能となります。
ページの PHP で下記の記載を行い、本日との比較も可能です。

PHP
$SPIRAL->setTHValue("today",date("Y-m-d"));
$SPIRAL->setTHValue("nowTime",date("H:m:s"));
※ 本日の日付を Thymeleaf に渡す処理となります。
ポイントとしては、日付形式で Thymeleaf に渡すことです。
日付の形式で、Thymeleaf に渡すことで演算することが可能になります。
日付で比較する方法は下記です。
<th:block th:if="${cp.result.value['today'] le record['f0x'].format('yyyy-MM-dd')}">
    <!-- アクセス日が 設定値以降の場合に表示が 場合に表示 -->
</th:block>
<th:block th:if="${cp.result.value['today'] gt record['f0x'].format('yyyy-MM-dd')}">
    <!-- アクセス日が 設定値より前の場合に表示が 場合に表示 -->
</th:block>
時間で比較する場合は日付を入れ子形式にすることで出しわけを行うことができます。
<th:block th:if="${cp.result.value['today'] eq record['f0x'].format('yyyy-MM-dd')}">
    <th:block th:if="${cp.result.value['nowTime'] le record['f0x'].format('HH:mm:ss')}">
        <!-- アクセス日が設定値と一致 かつ アクセス時間 設定値以降の場合に表示が 場合に表示 -->
    </th:block>
    <th:block th:if="${cp.result.value['nowTime'] ge record['f0x'].format('HH:mm:ss')}">
        <!-- アクセス日が設定値と一致 かつ アクセス時間 設定値以前の場合に表示が 場合に表示 -->
    </th:block>
</th:block>
書き方によっては、下記のように1行にまとめて分岐させることも可能です。
<th:block th:if="${cp.result.value['today'] eq record['フィールド'].format('yyyy-MM-dd') && cp.result.value['nowTime'] le record['フィールド'].format('HH:mm:ss')}">
    <!-- アクセス日が設定値と一致 かつ アクセス時間 設定値以降の場合に表示が 場合に表示 -->       
</th:block>
<th:block th:if="${cp.result.value['today'] eq record['フィールド'].format('yyyy-MM-dd') && cp.result.value['nowTime'] ge record['フィールド'].format('HH:mm:ss')}">
    <!-- アクセス日が設定値と一致 かつ アクセス時間 設定値以前の場合に表示が 場合に表示 -->
</th:block>
※ format() は、認証レコード値では、使用できないのでご注意ください。
Thyemeleaf で比較演算子を使用する場合は、下記に置き換えて使用してください。
== eq
!= ne
> gt
>= ge
< lt
<= le

認証値、引用値の 日付/月日/時刻 フィールド値を分解して表示する方法

認証値、引用値の 日付/月日/時刻 フィールドは、"テキスト"として一括で出力されます。
日付フィールドで年月のみ表示を行いたい や 月日フィールドで月のみ使用する場合、下記を利用します。

日付
<!-- 年のみ表示 -->       
<p th:text="|${siteClient.record[xx]?.year}年|"></p>

<!-- 月のみ表示 -->       
<p th:text="|${siteClient.record[xx]?.month}月|"></p>

<!-- 日のみ表示 -->       
<p th:text="|${siteClient.record[xx]?.day}日|"></p>

<!-- 年月のみ表示 -->       
<p th:text="|${siteClient.record[xx]?.year}年${siteClient.record[xx]?.month}月|"></p>
月日
<!-- 月のみ表示 -->       
<p th:text="|${siteClient.record[xx]?.month}月|"></p>

<!-- 日のみ表示 -->       
<p th:text="|${siteClient.record[xx]?.day}日|"></p>
時刻
<!-- 時のみ表示 -->       
<p th:text="|${siteClient.record[xx]?.hour}時|"></p>

<!-- 分のみ表示 -->       
<p th:text="|${siteClient.record[xx]?.minute}分|"></p>

<!-- 秒のみ表示 -->       
<p th:text="|${siteClient.record[xx]?.second}秒|"></p>

<!-- 時分のみ表示 -->       
<p th:text="|${siteClient.record[xx]?.hour}時${siteClient.record[xx]?.minute}分|"></p>

まとめ

Thymeleaf を修正した際は、必ず動作確認を必ず行い、動作に問題がないか確認をしてください。
また、ほかの小技が知りたいや不具合があった等ありましたら、下記の「コンテンツに関しての要望はこちら」からご連絡ください。
コンテンツに関しての
要望はこちら