Android 開発で未だに完全な Java 8 が使えないということもあり (Stream API でさえも最低ビルドターゲットを引き上げないと使用することができない)、どうしても Java 8 Time API への移行ができずにいにしえの Date や Calendar などを駆使してイマイチな日付処理を行う癖がついてしまっていた。
Spring Boot ならばちゃんと Java 8 Time API が使用できるので古い API は捨て去りたい。
しかし Thymeleaf が標準で備えている #dates.format() などのユーティリティメソッドは Date を対象としておりそのままでは LocalDateTime などは使用することができない。
これでは困ってしまうので拡張機能を導入する。
解決法
build.gradle に以下を追加する:
dependencies {
compile('org.thymeleaf.extras:thymeleaf-extras-java8time:3.0.1.RELEASE')
}
どこでもいいのだが component-scan 対象パッケージのどこかに以下のような @Bean 定義を置く:
@Configuration
class Configuration {
/**
* Java 8 Time Dialect を返却する.
*
* @return Java 8 Time Dialect
*/
@Bean
fun java8TimeDialect() = Java8TimeDialect()
}
これだけで Thymeleaf 上で LocalDate や LocalDateTime を扱うことができるようになる。
例えば #date.format() にあたるのは #temporals.format() で以下のように書く:
<div th:text="${#temporals.format(firstDate, 'yyyy/M/d')}"></div>
他の使い方は Thymeleaf - Module for Java 8 Time API compatibility の GitHub に書いてあるので参照すればすぐ分かるだろう。