Mysql 5.7

MyBatis 3.4.0

MySQL-Conector-Java-6.0.6

Hay una columna llamada sent_datetime en una tabla cuyo tipo es timestamp:

enter image description here

Hay un registro y el valor de sent_datetime es:

enter image description here

Podemos ver que su valor es 2019-06-20 17:24:34.

MySQL está en otro servidor cuyo sistema operativo es CENTOS 7.

El frijol Java es (configuro el sent_datetime como java.util.Date):

public class MailLog implements Serializable{

    private static final long serialVersionUID = 7752106961960847185L;

    private Date sent_datetime; 

    public Date getSent_datetime() {
        return sent_datetime;
    }   

}

En dao, cuando consulto este registro e imprimo el valor sent_datetime:

MailLog log = mybatisTemplate.selectOne("getMailLog", mailLog);

System.out.println(log.getSent_datetime());

Sin embargo, imprime fri 21 de junio 06:24:34 CST 2019 . Está mal.

Mientras tanto, si CST significa tiempo americano, debería ser 20th , no puede ser 21st , ¿verdad?

Si configuro sent_datetime como String en Java Bean, luego imprime el valor correcto.

Aún así, algunos registros guardan o muestran incorrectos, algunos son correctos.

¿Por qué pasa esto?

En MySQL, ejecuto SELECT @@global.time_zone, @@session.time_zone, @@system_time_zone;, devuelve SYSTEM SYSTEM CST.

1
frank 27 jun. 2019 a las 13:01

1 respuesta

La mejor respuesta

La razón del tiempo Diff 13H es la diferencia de definición de Zona TimeZone entre el conector JDBC y MySQL.

CST tiene 2 definiciones:

  1. Tiempo estándar central (EE. UU.) UTC-05: 00
  2. China Tiempo estándar UTC + 08: 00

En este caso:

  1. JDBC considera TimeZone es CST-5
  2. JBDC Transfiere Timestamp + 0 a CST-5
  3. MySQL considera TimeZone es CST + 8, Transferencia CST-5 a TIMESTAMP-13

Para obtener más información, puede hacer referencia al código fuente en com.mysql.cj.jdbc.ConnectionImpl.initializePropsFromServer() y com.mysql.cj.jdbc.PreparedStatement.setTimestamp()

Use +08:00 en lugar de CST solucione este problema.

set global time_zone = '+08:00';

O

jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf-8&autoReconnect=true&serverTimezone=Asia/Shanghai
2
kext 28 jun. 2019 a las 13:32