Como trabalhar com datas no Thymeleaf

Como trabalhar com datas no Thymeleaf

1. Introdução

Thymeleaf é um mecanismo de template Java projetado para funcionar diretamente com Spring. Para uma introdução de Thymeleaf e Spring, dê uma olhada emthis write-up.

Além dessas funções básicas, o Thymeleaf oferece um conjunto de objetos utilitários que nos ajudarão a executar tarefas comuns em nosso aplicativo.

Neste artigo, discutiremos o processamento e a formatação das classes novas e antigas do JavaDate com alguns recursos do Thymeleaf 3.0.

2. Dependências do Maven

Primeiro, vamos ver a configuração necessária para integrar Thymeleaf com Spring em nossopom.xml:


    org.thymeleaf
    thymeleaf
    3.0.9.RELEASE


    org.thymeleaf
    thymeleaf-spring4
    3.0.9.RELEASE

As versões mais recentes dethymeleaf ethymeleaf-spring5 can podem ser encontradas no Maven Central. Observe que, para um projeto Spring 4, a bibliotecathymeleaf-spring4 deve ser usada em vez dethymeleaf-spring5.

Além disso, para trabalhar com novas classes Java 8Date, adicionaremos a seguinte dependência ao nossopom.xml:


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

Othymeleaf extras é um módulo opcional, totalmente suportado pela equipe oficial do Thymeleaf, que foi criado para compatibilidade com a API Java 8 Time. Ele adiciona um objeto #temporals aoContext como um processador de objeto utilitário durante as avaliações de expressão. Isso significa que ele pode ser usado para avaliar expressões na Linguagem de Navegação por Objetos Gráficos (OGNL) e na Spring Expression Language (SpringEL).

3. Antigo e novo:java.util ejava.time

O pacoteTime é uma nova data, hora e API de calendário para a plataforma Java SE. A principal diferença entre o legado antigoDate e é que a nova API distingue entre visualizações humanas e de máquina de uma linha do tempo. A vista da máquina revela uma sequência de valores integrais em relação aosepoch,, enquanto a vista revela um conjunto de campos (por exemplo, ano ou dia).

Para trabalhar com o novo pacoteTime, precisamos configurar nosso mecanismo de modelo para usar o novoJava8TimeDialect:

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

Isso adicionará o objeto #temporals semelhante aos do dialeto padrão, permitindo a formatação e criação de objetosTemporal a partir dos modelos do Thymeleaf.

A fim de testar o processamento de classes novas e antigas, vamos criar as seguintes variáveis ​​e adicioná-las como objetos de modelo à nossa classe de controlador:

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

Agora estamos prontos para usarExpressioneTemporalsUtility Objects fornecidos pelo Thymeleaf.

3.1. Formatar datas

A primeira função que queremos cobrir é a formatação de um objetoDate (que é adicionado aos parâmetros do modelo Spring). Decidimos usar o formatoISO8601:

Format ISO

Não importa como nossoDate foi definido no lado posterior, ele será mostrado de acordo com o padrão selecionado. OstandardDate será processado pelo utilitário #dates. As novas classesLocalDateTime,LocalDateeInstant serão processadas pelo utilitário #temporals. Este é o resultado final que veremos no navegador:

Este é o resultado final que veremos no navegador:

image

Além disso, se queremos definir o formato manualmente, podemos fazê-lo usando:

Format manually

Como podemos observar, não podemos processar a classeInstant com #temporals.format(…) - isso resultará emUnsupportedTemporalTypeException. Além disso, a formatação deLocalDate só é possível se especificarmos apenas os campos de data específicos, pulando os campos de hora.

O resultado final:

image

 

3.2. Obtenha campos de data específicos

Para obter os campos específicos da classejava.util.Date, devemos usar os seguintes objetos utilitários:

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

Para o novo pacotejava.time, devemos ficar com os utilitários #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)}

Vejamos alguns exemplos. Primeiro, vamos mostrar o dia da semana de hoje:

Show only which day of a week

A seguir, vamos mostrar o nome do dia da semana:

Show the name of the week day

E, finalmente, vamos mostrar o segundo atual do dia:

Show the second of the day

Observe que para trabalhar com partes de tempo, você precisaria usarLocalDateTime, poisLocalDate gerará um erro.

4. Conclusão

Neste tutorial rápido, discutimos os recursos de processamento JavaDate implementados na estrutura Thymeleaf, versão 3.0.

A implementação completa deste tutorial pode ser encontrada emthe GitHub project - este é um projeto baseado em Maven que é fácil de importar e executar.

How to test? Nossa sugestão é brincar com o código em um navegador primeiro e, em seguida, verificar nossos testes JUnit existentes também.

Observe que nossos exemplos não cobrem todas as opções disponíveis no Thymeleaf. Se você quiser aprender sobre todos os tipos de utilitários, dê uma olhada em nosso artigo cobrindoSpring and Thymeleaf Expressions.