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 に書いてあるので参照すればすぐ分かるだろう。