Как работать с датами в Thymeleaf

Как работать с датами в Thymeleaf

1. Вступление

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

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

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

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

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


    org.thymeleaf
    thymeleaf
    3.0.9.RELEASE


    org.thymeleaf
    thymeleaf-spring4
    3.0.9.RELEASE

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

Более того, чтобы работать с новыми классами Java 8Date, мы добавим следующую зависимость к нашемуpom.xml:


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

thymeleaf extras - это дополнительный модуль, полностью поддерживаемый официальной командой Thymeleaf, который был создан для совместимости с Java 8 Time API. Он добавляет объект #temporals кContext в качестве обработчика служебных объектов во время оценки выражений. Это означает, что его можно использовать для оценки выражений на языке навигации объектов-графиков (OGNL) и на языке выражений Spring (SpringEL).

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

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

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

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

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

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

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

Теперь мы готовы использоватьExpression иTemporalsUtility Objects, предоставленные Thymeleaf.

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

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

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

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

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

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

Обратите внимание, что наши примеры не охватывают все доступные опции в Thymeleaf. Если вы хотите узнать обо всех типах утилит, прочтите нашу статью оSpring and Thymeleaf Expressions.