mybatis конвертировать метку времени в Java дата неверна - PullRequest
0 голосов
/ 27 июня 2019

mysql 5.7

mybatis 3.4.0

mysql-connector-java-6.0.6

В таблице есть столбец с именем sent_datetime, тип которого равенtimestamp:

enter image description here

существует запись, и значение sent_datetime равно:

enter image description here

Мы можем видеть, что его значение равно 2019-06-20 17:24:34.

MySql находится на другом сервере, ОС которого равна centos 7.

Java-бин (Iустановите sent_datetime как 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;
    }   

}

In dao, когда я запрашиваю эту запись и печатаю значение sent_datetime:

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

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

Однако онопечатает пт 21 июня 06:24:34 CST 2019 .Это неправильно.

Между тем, если CST означает американское время, оно должно быть 20 , НЕ МОЖЕТ БЫТЬ 21 * , верно?

ЕслиЯ устанавливаю sent_datetime как String в Java-бине, затем он печатает правильное значение.

Тем не менее, некоторые записи сохраняются или отображаются некорректно, некоторые верны.

Почему это происходит?

В mysql я запускаю SELECT @@global.time_zone, @@session.time_zone, @@system_time_zone;, он возвращает SYSTEM SYSTEM CST.

1 Ответ

1 голос
/ 28 июня 2019

Причиной разницы во времени 13h является разница в определении часового пояса между JDBC и коннектором MySQL.

CST имеет 2 определения:

  1. Центральное поясное время (США) UTC-05: 00
  2. Стандартное время Китая UTC + 08: 00

В этом случае:

  1. JDBC считает часовой пояс CST-5
  2. JBDC передает метку времени + 0 в CST-5
  3. MySQL считает, что часовой пояс - CST + 8, перевод CST-5 в Timestamp-13

Для более подробной информации, вы можете ссылаться на исходный код в com.mysql.cj.jdbc.ConnectionImpl.initializePropsFromServer() и com.mysql.cj.jdbc.PreparedStatement.setTimestamp()

Используйте +08:00 вместо CST, чтобы исправить эту проблему.

set global time_zone = '+08:00';

или

jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf-8&autoReconnect=true&serverTimezone=Asia/Shanghai
...