Как работать с датами в 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. Это окончательный результат, который мы увидим в браузере:
Это окончательный результат, который мы увидим в браузере:
Более того, если мы хотим установить формат вручную, мы можем сделать это с помощью:
Format manually
Как мы видим, мы не можем обработать класс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)}
Давайте посмотрим на несколько примеров. Во-первых, давайте покажем сегодняшний день недели:
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.