«1. Введение

Thymeleaf — это механизм шаблонов Java, предназначенный для работы непосредственно с Spring. Чтобы познакомиться с Thymeleaf и Spring, ознакомьтесь с этой статьей.

Помимо этих основных функций, Thymeleaf предлагает нам набор служебных объектов, которые помогут нам выполнять общие задачи в нашем приложении.

В этой статье мы обсудим обработку и форматирование новых и старых классов Java Date с несколькими функциями Thymeleaf 3.0.

2. Зависимости Maven

Во-первых, давайте посмотрим на конфигурацию, необходимую для интеграции Thymeleaf со Spring в наш pom.xml:

<dependency>
    <groupId>org.thymeleaf</groupId>
    <artifactId>thymeleaf</artifactId>
    <version>3.0.11.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.thymeleaf</groupId>
    <artifactId>thymeleaf-spring5</artifactId>
    <version>3.0.11.RELEASE</version>
</dependency>

Последние версии thymeleaf и thymeleaf-spring5 можно найти на Maven Central. Обратите внимание, что для проекта Spring 4 необходимо использовать библиотеку тимелеаф-спринг4 вместо тимелеаф-спринг5.

Кроме того, для работы с новыми классами Date Java 8 мы добавим в наш pom.xml следующую зависимость: который был создан для совместимости с Java 8 Time API. Он добавляет объект #temporals в Context в качестве обработчика служебных объектов во время оценки выражений. Это означает, что его можно использовать для оценки выражений на языке навигации по графам объектов (OGNL) и языке выражений Spring (SpringEL).

<dependency>
    <groupId>org.thymeleaf.extras</groupId>
    <artifactId>thymeleaf-extras-java8time</artifactId>
    <version>3.0.4.RELEASE</version>
</dependency>

3. Старое и новое: java.util и java.time

Пакет Time — это новый API даты, времени и календаря для платформы Java SE. Основное различие между старым устаревшим Date и заключается в том, что новый API различает машинное и человеческое представление временной шкалы. Машинное представление показывает последовательность целочисленных значений относительно эпохи, тогда как представление показывает набор полей (например, год или день).

Для работы с новым пакетом Time нам нужно настроить наш механизм шаблонов для использования нового диалекта Java8TimeDialect:

Это добавит объект #temporals, подобный объектам в стандартном диалекте, что позволит создание временных объектов из шаблонов Thymeleaf.

private ISpringTemplateEngine templateEngine(ITemplateResolver templateResolver) {
    SpringTemplateEngine engine = new SpringTemplateEngine();
    engine.addDialect(new Java8TimeDialect());
    engine.setTemplateResolver(templateResolver);
    return engine;
}

Чтобы протестировать обработку новых и старых классов, мы создадим следующие переменные и добавим их в качестве объектов модели в наш класс контроллера:

Теперь мы готовы использовать объекты Expression и Temporals Utility Objects. предоставлено Thymeleaf.

model.addAttribute("standardDate", new Date());
model.addAttribute("localDateTime", LocalDateTime.now());
model.addAttribute("localDate", LocalDate.now());
model.addAttribute("timestamp", Instant.now());

3.1. Формат даты

Первая функция, которую мы хотим рассмотреть, — это форматирование объекта Date (который добавляется к параметрам модели Spring). Мы решили использовать формат ISO8601:

Независимо от того, как наша дата была установлена ​​на стороне сервера, она будет отображаться в соответствии с выбранным стандартом. StandardDate будет обрабатываться утилитой #dates. Новые классы LocalDateTime, LocalDate и Instant будут обрабатываться утилитой #temporals. Это окончательный результат, который мы увидим в браузере:

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

Это окончательный результат, который мы увидим в браузере:

Кроме того, если мы хотим установить формат вручную, мы можем сделать это, используя:

Как мы видим, мы не можем обработать класс Instant с помощью #temporals.format(…) — это приведет к исключению UnsupportedTemporalTypeException. Более того, форматирование LocalDate возможно только в том случае, если мы укажем только конкретные поля даты, пропустив поля времени.

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

Конечный результат:

3.2. Получение определенных полей даты

Чтобы получить определенные поля класса java.util.Date, мы должны использовать следующие служебные объекты:

Для нового пакета java.time мы должны придерживаться # Утилиты Temporal:

Давайте рассмотрим несколько примеров. Сначала покажем сегодняшний день недели:

${#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)}

Далее покажем название дня недели:

${#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>

Обратите внимание, что для работы с частями времени вам нужно будет использовать LocalDateTime, так как LocalDate выдаст ошибку.

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

4. Заключение

<h1>Show the second of the day</h1>
<p th:text="${#dates.second(standardDate)}"></p>
<p th:text="${#temporals.second(localDateTime)}"></p>

В этом кратком руководстве мы обсудили функции обработки даты Java, реализованные в платформе Thymeleaf версии 3.0.

«Полную реализацию этого руководства можно найти в проекте GitHub — это проект на основе Maven, который легко импортировать и запускать.

Как проверить? Мы предлагаем сначала поиграть с кодом в браузере, а затем также проверить наши существующие тесты JUnit.

Обратите внимание, что наши примеры не охватывают все доступные параметры в Thymeleaf. Если вы хотите узнать обо всех типах утилит, ознакомьтесь с нашей статьей, посвященной выражениям Spring и Thymeleaf.

«

Please note that our examples do not cover all available options in Thymeleaf. If you want to learn about all types of utilities, then take a look at our article covering Spring and Thymeleaf Expressions.