1
resposta

fmt:formatDate exibindo data errada +3hs

Pessoal,

As datas estão corretas no banco, mas quando são resgatadas, ficam com 3 horas a mais, o que está deixando as datas as vezes com um dia a mais.

Data no banco: 2019-11-09 23:00:00

Data no jsp: 10/11/2019

Método do DAO do produto que busca as infos:

public Produto find(int id){ Produto p = manager.createQuery("select distinct(p) from Produto p join fetch p.precos precos where p.id = :id", Produto.class).setParameter("id", id).getSingleResult(); System.out.println(p.toString()); return p; }

Saída do console (atributo dataLancamento)

java.util.GregorianCalendar[time=1573351200000,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="America/Sao_Paulo",offset=-10800000,dstSavings=3600000,useDaylight=true,transitions=129,lastRule=java.util.SimpleTimeZone[id=America/Sao_Paulo,offset=-10800000,dstSavings=3600000,useDaylight=true,startYear=0,startMode=3,startMonth=10,startDay=1,startDayOfWeek=1,startTime=0,startTimeMode=0,endMode=3,endMonth=1,endDay=15,endDayOfWeek=1,endTime=0,endTimeMode=0]],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2019,MONTH=10,WEEK_OF_YEAR=46,WEEK_OF_MONTH=3,DAY_OF_MONTH=10,DAY_OF_YEAR=314,DAY_OF_WEEK=1,DAY_OF_WEEK_IN_MONTH=2,AM_PM=0,HOUR=0,HOUR_OF_DAY=0,MINUTE=0,SECOND=0,MILLISECOND=0,ZONE_OFFSET=-10800000,DST_OFFSET=3600000]

Classe Modelo: @Entity public class Produto {

@Id @GeneratedValue(strategy=GenerationType.IDENTITY)
private int id;

private String titulo;
private String descricao;
private int paginas;

private String sumarioPath;

    @ElementCollection
private List<Preco> precos;

@DateTimeFormat
private Calendar dataLancamento;


public Calendar getDataLancamento() {
    return dataLancamento;
}

public void setDataLancamento(Calendar dataLancamento) {
    this.dataLancamento = dataLancamento;
1 resposta

Olá Bruna, Tudo bem? Analisando a saída do console notei que o valor do tempo é 1573351200000 que representa a data Sunday, 10 November 2019 02:00:00 no GMT, ou seja, sem o nosso fuso horário.

É importante notar que por padrão o Calendar armazena o tempo sempre em UTC/GMT-0, mas você pode definir o TimeZone para que ele exiba a informação correta, por exemplo:

/// [...]resto do código da classe[...]
public void setDataLancamento(Calendar dataLancamento) {
    this.dataLancamento = dataLancamento;
    this.dataLancamento.setTimeZone("America/Sao_Paulo");
}

Contudo pelo que vi o seu código aparentemente já faz isso, neste caso ao chamar algo como por exemplo:

// Onde p é o produto
System.out.println("%td/%<tm/%<$tY", p.getDataLancamento());

A data deveria ser exibida corretamente, existe também a possibilidade de passar um formatador, neste caso pode ser necessário passar o TimeZone de novo como é o caso do SimpleDateFormat -> https://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html#SimpleDateFormat(java.lang.String,%20java.util.Locale).

// p é o produto
DateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
dateFormat.setTimeZone(TimeZone.getTimeZone("America/Sao_Paulo"));
System.out.println(dateFormat.format(p.getDataLancamento()));

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software