[RESOLVIDO] Hibernate esta salvando a data errada

Boa noite pessoal,
Estou um um probleminha chato, creio que seja algo relacionado a alguma configuração do hibernate.
Estou tentando salvar uma data, mas quando salvo o registro a data e horário que ficam salvo esta errado.

jdbc:mysql://localhost:3306/meubanco?useTimezone=true&serverTimezone=UTC

@Temporal(TemporalType.TIMESTAMP)
@Column(name=“dt_cadastro”, length=10)
public Date getDtCadastro() {
return dtCadastro;
}

usuario.setDtCadastro(new Date());

Estou usando o mysql, no meu banco o campo esta como TIMESTAMP, quando imprimo pelo netbeans, ele exibe a data correta, mas quando vai pro banco vai a data errada. Aguem sabe o que posso estar fazendo errado?

Qual a diferença?

Por exemplo ontem eu estava tentando salvar a data de ontem 14/01/2020 22:44:32 e quando ia pro banco estava 15/01/2020 00:45:55.

Quando dava um system.out.println(new Date()) aparecia a hora correta, por isso suapeitei de alguma configuração do hibernate.

Você está definindo a conexão com o timezone UTC. Deve ser isso.

Há um tempo atrás tive um problema em que a data era salva com 3 horas de diferença da atual. Resolvi colocando o serverTimezone = America/Sao_Paulo, conforma abaixo. Se for esse seu caso pode fazer teste na sua string de conexão dessa forma:

jdbc:mysql://localhost:3306/seu_banco?useTimezone=true&serverTimezone=America/Sao_Paulo

Att.

Recomendo não utilizar Timezone=America/Sao_Paulo,
Com a nova regra do horário de verão, se seu java não estiver atualizado para a última versão ele vai dar problema.
Você pode testar a opção acima, caso ocorra algum problema, tente colocar UTC -3.

1 curtida

Boa noite,
Desculpe a demora mais só agora consegui testar, eu tentei conforme o romario.mota sugeriu:

jdbc:mysql://localhost:3306/seu_banco?useTimezone=true&serverTimezone=America/Sao_Paulo

funcionou, porém acredito que esse horário seja de São Paulo, eu moro em Manaus, daí aconteceu de o horário ficar 2 horas a mais. Teria algum serverTimeZone para cá?

Testei também como o rodrigomarden sugeriu:

jdbc:mysql://localhost:3306/seu_banco?useTimezone=true&serverTimezone=UTC -3

porém quando testei assim deu erro, estava pesquisando sobre esse UTC e parece que aqui pra minha cidade é o UTC -4, conforme o site(https://www.timeanddate.com/time/zone/brazil) porem tentei também e não consegui.
Talvez seja algum detalhe, alguem saberia como ajustar?

Fale serrao, blz?

Existe um TimeZone chamado America/Manaus que você poderia substituir. Fiz um teste rápido aqui e aparentemente a data inserida ficou com a hora de Manaus.

Sobre a informação do rodrigo. Se colocar UTC ele continua com o mesmo problema. Tentei colocar UTC-3 mais ele não reconhece como um timezone valido e apresenta o seguinte erro:

Exception in thread "main" java.sql.SQLException: No timezone mapping entry for 'UTC-3'
	at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:129)
	at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:97)
	at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:89)
	at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:63)
	at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:73)
	at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:85)
	at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:835)
	at com.mysql.cj.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:455)
	at com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:240)
	at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:199)
	at java.sql/java.sql.DriverManager.getConnection(DriverManager.java:677)
	at java.sql/java.sql.DriverManager.getConnection(DriverManager.java:228)

Seria bom se tivesse a opção de utilizar o formato UTC-3, mas não encontrei a forma de ele funcionar. Se o @Rodrigomarden tiver essa informação, também gostaria de saber.

Obrigado romario.mota.
Ficou certinho agora :slight_smile: