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]をご覧ください。