Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

fmt:formatDate exibindo data errada

Não consegui encontrar o motivo. Todas as datas exibidas pela JSTL 'fmt:formatDate' estão com um dia a menos.

Estou usando a seguinte formatação:

<fmt:formatDate pattern="dd/MM/yyyy" value="${produto.dataLancamento.time}"  />

Detalhe que a data no banco de dados está correta.

Exemplo:

Data no banco de dados: 2019-04-26 00:00:00

Data exibida pela JSTL: 25/04/2019

Método de Conversão (Classe AppWebConfiguration)

    @Bean
    public FormattingConversionService mvcConversionService() {
        DefaultFormattingConversionService conversionService = new DefaultFormattingConversionService(); 
        DateFormatterRegistrar registrar = new DateFormatterRegistrar();
        registrar.setFormatter(new DateFormatter("dd/MM/yyyy"));;
        registrar.registerFormatters(conversionService);

        return conversionService;
    }
2 respostas
solução!

Welton, isso é por conta do timezone.

O timezone em Brasília é UTC-3, ou seja, se voltarmos 3h na data: 2019-04-26 00:00:00 teremos a data 25/04/2019.

Ou o timezone no seu banco de dados precisa ser armazenado com o timezone correto, ou no Java você precisa "ignorar" esse timezone. Provavelmente no seu BD está com timezone UTC

SimpleDateFormat isoFormat = new SimpleDateFormat("yyyy-MM-dd");
isoFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
Date date = isoFormat.parse("2019-04-26 00:00:00")

Era justamente esse o problema.

Eu estava definindo o timezone como UTC ao acessar o BD pelo comando (Classe JPAConfiguration):

dataSource.setUrl("jdbc:mysql://localhost:3306/casadocodigo?useTimezone=true&serverTimezone=UTC");

Removi o parâmetro de Timezone:

dataSource.setUrl("jdbc:mysql://localhost:3306/casadocodigo");

E alterei o time zone diretamente no mySQL com os dois comandos:

SET GLOBAL time_zone = '-3';

SET time_zone = '-3';

Problema resolvido!

Muito obrigado pela ajuda Otávio.