Thymeleafで日付を操作する方法
1前書き
Thymeleaf
は、Springと直接連携するように設計されたJavaテンプレートエンジンです。 ThymeleafとSpringの紹介については、リンクを見てください:/thymeleaf-in-spring-mvc[この記事を書く]
これらの基本的な機能に加えて、Thymeleafは私達に私達が私達のアプリケーションで一般的なタスクを実行するのを助けるであろうユーティリティオブジェクトのセットを提供します。
この記事では、Thymeleaf 3.0の便利な機能を使って、新旧のJavaのDateクラスの処理とフォーマットについて説明します。
2 Mavenの依存関係
まず、ThymeleafとSpringを
pom.xml
に統合するために必要な設定を見てみましょう。
<dependency>
<groupId>org.thymeleaf</groupId>
<artifactId>thymeleaf</artifactId>
<version>3.0.9.RELEASE</version>
</dependency>
<dependency>
<groupId>org.thymeleaf</groupId>
<artifactId>thymeleaf-spring4</artifactId>
<version>3.0.9.RELEASE</version>
</dependency>
thymeleaf
および
__https:/の最新バージョン/search.maven.org/classic/#search%7Cgav%7C1%7Cg%3A%22org.thymeleaf%22%20AND%20a%3A%22thymeleaf-spring5%22[thymeleaf-spring5]
はMaven Centralにあります。 Spring 4プロジェクトでは、
thymeleaf-spring5
の代わりに
thymeleaf-spring4__ライブラリを使用する必要があります。
さらに、新しいJava 8
Date
クラスを扱うために、
pom.xml
に次の依存関係を追加します。
<dependency>
<groupId>org.thymeleaf.extras</groupId>
<artifactId>thymeleaf-extras-java8time</artifactId>
<version>3.0.1.RELEASE</version>
</dependency>
https://search.maven.org/classic/
search%7Cgav%7C1%7Ca%3A%22thymeleaf-extras-java8time%22[thymeleaf extras]
は、公式のThymeleafチームによって完全にサポートされているオプションモジュールですJava 8 Time APIとの互換性のために作成されました。式の評価中に、ユーティリティオブジェクトプロセッサとして
temporals
オブジェクトが
Context
に追加されます。これは、オブジェクトグラフナビゲーション言語(OGNL)およびSpring Expression Language(SpringEL)で式を評価するために使用できることを意味します。
3新旧:java.util
および
java.time
Time
パッケージは、Java SEプラットフォーム用の新しい日付、時刻、およびカレンダAPIです。古いレガシー
Date
との主な違いは、新しいAPIがタイムラインのマシンビューとヒューマンビューを区別することです。マシンビューは__epochに関連した一連の整数値を明らかにし、ビューは一連のフィールド(例えば年または日)を明らかにする。
新しい
Time
パッケージを使用するには、新しい
Java8TimeDialect
を使用するようにテンプレートエンジンを設定する必要があります。
private ISpringTemplateEngine templateEngine(ITemplateResolver templateResolver) {
SpringTemplateEngine engine = new SpringTemplateEngine();
engine.addDialect(new Java8TimeDialect());
engine.setTemplateResolver(templateResolver);
return engine;
}
これは標準の方言のものと同様の#
temporals
オブジェクトを追加し、Thymeleafテンプレートからの
Temporal
オブジェクトのフォーマットと作成を可能にします。
新しいクラスと古いクラスの処理をテストするために、次の変数を作成し、それらをモデルオブジェクトとしてコントローラクラスに追加します。
model.addAttribute("standardDate", new Date());
model.addAttribute("localDateTime", LocalDateTime.now());
model.addAttribute("localDate", LocalDate.now());
model.addAttribute("timestamp", Instant.now());
これで、Thymeleafが提供する
Expression
と
Temporals
Utility Objects
を使用する準備が整いました。
3.1. フォーマット日付
最初に取り上げる機能は
Date
オブジェクトのフォーマットです(これはSpringモデルのパラメータに追加されます)。私たちは
ISO8601
フォーマットを使うことに決めました:
<h1>Format ISO</h1>
<p th:text="${#dates.formatISO(standardDate)}"></p>
<p th:text="${#temporals.formatISO(localDateTime)}"></p>
<p th:text="${#temporals.formatISO(localDate)}"></p>
<p th:text="${#temporals.formatISO(timestamp)}"></p>
Date
がどのようにバックエンド側に設定されていても、選択された標準に従って表示されます。
standardDate
は#
dates
ユーティリティによって処理されます。新しい
LocalDateTime、
LocalDate
、および
Instant
の各クラスは、#
temporals
ユーティリティによって処理されます。これがブラウザに表示される最終結果です。
これがブラウザに表示される最終結果です。
リンク:/uploads/Zrzut-ekranu-2017-01-09-11.09.34-300×250-2-300×250.png
さらに、フォーマットを手動で設定したい場合は、次のようにして設定できます。
<h1>Format manually</h1>
<p th:text="${#dates.format(standardDate, 'dd-MM-yyyy HH:mm')}"></p>
<p th:text="${#temporals.format(localDateTime, 'dd-MM-yyyy HH:mm')}"></p>
<p th:text="${#temporals.format(localDate, 'MM-yyyy')}"></p>
ご覧のとおり、
Instant
クラスを#
temporals.format(…)
で処理することはできません。その結果、
UnsupportedTemporalTypeException
が発生します。さらに、
LocalDate
のフォーマットは、時間フィールドをスキップして特定の日付フィールドのみを指定する場合にのみ可能です。
最終結果:
3.2. 特定の日付フィールドを取得する
java.util.Date
クラスの特定のフィールドを取得するには、以下のユーティリティオブジェクトを使用する必要があります。
${#dates.day(date)}
${#dates.month(date)}
${#dates.monthName(date)}
${#dates.monthNameShort(date)}
${#dates.year(date)}
${#dates.dayOfWeek(date)}
${#dates.dayOfWeekName(date)}
${#dates.dayOfWeekNameShort(date)}
${#dates.hour(date)}
${#dates.minute(date)}
${#dates.second(date)}
${#dates.millisecond(date)}
新しい
java.time
パッケージの場合は、#
temporals
ユーティリティを使い続ける必要があります。
${#temporals.day(date)}
${#temporals.month(date)}
${#temporals.monthName(date)}
${#temporals.monthNameShort(date)}
${#temporals.year(date)}
${#temporals.dayOfWeek(date)}
${#temporals.dayOfWeekName(date)}
${#temporals.dayOfWeekNameShort(date)}
${#temporals.hour(date)}
${#temporals.minute(date)}
${#temporals.second(date)}
${#temporals.millisecond(date)}
いくつかの例を見てみましょう。まず、今日の曜日を見てみましょう。
<h1>Show only which day of a week</h1>
<p th:text="${#dates.day(standardDate)}"></p>
<p th:text="${#temporals.day(localDateTime)}"></p>
<p th:text="${#temporals.day(localDate)}"></p>
次に、平日の名前を表示しましょう。
<h1>Show the name of the week day</h1>
<p th:text="${#dates.dayOfWeekName(standardDate)}"></p>
<p th:text="${#temporals.dayOfWeekName(localDateTime)}"></p>
<p th:text="${#temporals.dayOfWeekName(localDate)}"></p>
そして最後に、その日の現在の秒を表示しましょう。
<h1>Show the second of the day</h1>
<p th:text="${#dates.second(standardDate)}"></p>
<p th:text="${#temporals.second(localDateTime)}"></p>
LocalDate
はエラーをスローするので、時間部分を扱うには
LocalDateTime
を使う必要があることに注意してください。
4結論
このクイックチュートリアルでは、Thymeleafフレームワーク、バージョン3.0に実装されたJavaの日付処理機能について説明しました。
このチュートリアルの完全な実装はhttps://github.com/eugenp/tutorials/tree/master/spring-thymeleaf[GitHubプロジェクト]にあります – これはMavenベースのプロジェクトで、インポートと実行が簡単です。
-
テスト方法?** まずブラウザでコードを試してから、既存のJUnitテストを確認してください。
私たちの例はThymeleafで利用可能なすべてのオプションを網羅しているわけではないことに注意してください。すべての種類のユーティリティについて学びたい場合は、リンクをカバーする私たちの記事:/spring-thymeleaf-3-expressions[Spring and Thymeleaf Expressions]をご覧ください。