Thymeleafで日付を操作する方法

Thymeleafで日付を操作する方法

1. 前書き

Thymeleafは、Springと直接連携するように設計されたJavaテンプレートエンジンです。 ThymeleafとSpringの紹介については、this write-upをご覧ください。

これらの基本機能に加えて、Thymeleafは、アプリケーションで一般的なタスクを実行するのに役立つユーティリティオブジェクトのセットを提供します。

この記事では、Thymeleaf 3.0のいくつかの機能を備えた新旧のJavaDateクラスの処理とフォーマットについて説明します。

2. Mavenの依存関係

まず、ThymeleafとSpringをpom.xmlに統合するために必要な構成を見てみましょう。


    org.thymeleaf
    thymeleaf
    3.0.9.RELEASE


    org.thymeleaf
    thymeleaf-spring4
    3.0.9.RELEASE

thymeleafthymeleaf-spring5 の最新バージョンは、MavenCentralにあります。 Spring 4プロジェクトの場合、thymeleaf-spring5の代わりにthymeleaf-spring4ライブラリを使用する必要があることに注意してください。

さらに、新しいJava 8Dateクラスを操作するために、次の依存関係をpom.xmlに追加します。


    org.thymeleaf.extras
    thymeleaf-extras-java8time
    3.0.1.RELEASE

thymeleaf extrasは、Java 8 Time APIとの互換性のために作成された、公式のThymeleafチームによって完全にサポートされているオプションのモジュールです。 式の評価中に、ユーティリティオブジェクトプロセッサとして#temporalsオブジェクトをContextに追加します。 これは、Object-Graph Navigation Language(OGNL)およびSpring Expression Language(SpringEL)の式を評価するために使用できることを意味します。

3. 古いものと新しいもの:java.utiljava.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およびTemporalsUtility Objectsを使用する準備が整いました。

3.1. 日付のフォーマット

カバーしたい最初の関数は、Dateオブジェクトのフォーマットです(これはSpringモデルパラメーターに追加されます)。 ISO8601形式を使用することにしました。

Format ISO

バックエンド側でDateがどのように設定されていても、選択した標準に従って表示されます。 standardDateは、#datesユーティリティによって処理されます。 新しいLocalDateTime,LocalDateおよびInstantクラスは、#temporalsユーティリティによって処理されます。 これは、ブラウザに表示される最終結果です。

これは、ブラウザに表示される最終結果です。

image

さらに、フォーマットを手動で設定する場合は、次を使用して行うことができます。

Format manually

観察できるように、Instantクラスを#temporals.format(…)で処理することはできません—結果としてUnsupportedTemporalTypeExceptionになります。 さらに、LocalDateのフォーマットは、特定の日付フィールドのみを指定し、時間フィールドをスキップする場合にのみ可能です。

最終結果:

image

 

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)}

いくつかの例を見てみましょう。 まず、今日の曜日を表示しましょう。

Show only which day of a week

次に、曜日の名前を表示しましょう。

Show the name of the week day

そして最後に、その日の現在の秒を表示しましょう。

Show the second of the day

LocalDateはエラーをスローするため、時間部分を処理するには、LocalDateTimeを使用する必要があることに注意してください。

4. 結論

このクイックチュートリアルでは、Thymeleafフレームワークバージョン3.0に実装されているJavaDateの処理機能について説明しました。

このチュートリアルの完全な実装はthe GitHub projectにあります。これは、インポートと実行が簡単なMavenベースのプロジェクトです。

How to test?最初にブラウザーでコードを試してから、既存のJUnitテストも確認することをお勧めします。

この例は、Thymeleafで利用可能なすべてのオプションを網羅しているわけではないことに注意してください。 すべてのタイプのユーティリティについて知りたい場合は、Spring and Thymeleaf Expressionsをカバーする記事をご覧ください。