Java JPA дата 14 часов вперед - PullRequest
2 голосов
/ 08 марта 2020

Я использую JPA для запроса mysql базы данных на CentOS6.

Информация об окружающей среде:

[~]# java -version
openjdk version "1.8.0_121"
OpenJDK Runtime Environment (build 1.8.0_121-b13)
OpenJDK 64-Bit Server VM (build 25.121-b13, mixed mode)

[~]# mysql --version
mysql  Ver 8.0.17 for Linux on x86_64 (MySQL Community Server - GPL)

[~]# tomcat version
Server version: Apache Tomcat/7.0.78
Server built:   Jun 9 2017 19:56:49 UTC
Server number:  7.0.78.0
OS Name:        Linux
OS Version:     2.6.32-754.17.1.el6.x86_64
Architecture:   amd64
JVM Version:    1.8.0_121-b13
JVM Vendor:     Oracle Corporation

[~]# date
Mon Mar  9 01:21:20 CST 2020

[~]# date -R
Mon, 09 Mar 2020 01:21:23 +0800

[~]# ls -al /etc/localtime
lrwxrwxrwx 1 root root 33 Jun  3  2015 /etc/localtime -> /usr/share/zoneinfo/Asia/Shanghai

/ etc / my.cnf

[mysqld]
default-time-zone='+08:00'

Конфигурация часового пояса MySQL:

show variables like '%time_zone%';
----
system_time_zone    CST
time_zone   +08:00

Libs:

'mysql:mysql-connector-java:8.0.19',
'org.hibernate:hibernate-entitymanager:5.0.12.Final',
'org.springframework.data:spring-data-jpa:1.9.6.RELEASE',

Строка подключения:

db.url=jdbc:mysql://localhost:3306/saa?useSSL=false&useLegacyDatetimeCode=false&serverTimezone=Asia/Shanghai

Отображение JPA:

import java.util.Date;

public class XXX {
    @Column(name = "date")
    @Temporal(TemporalType.DATA)
    private Date date;

    //...
}

Таблица mytable имеет столбец типа DATE date

select DATE_FORMAT(date, '%Y-%m-%d %H:%i:%S'), UNIX_TIMESTAMP(date) from mytable;
----
'2018-12-31 00:00:00', '1546185600'

Java Запрос:

logger.debug("{}({})", DateFormatUtils.ISO_DATETIME_FORMAT.format(date), date.getTime());
----
2018-12-31T14:00:00(1546236000000)

Как видите, дата java get опережает 14 hours по сравнению с базой данных.

Я знаю, что часовой пояс CST имеет различное значение в java и mysql, поэтому я настроил их так, как было предложено много документов. , Но все равно это не работает.

  • Я уже использую TemporalType.DATA, почему у объекта Date все еще есть секция часов?
  • Что еще я должен попытаться получить в Date правильно java?

1 Ответ

2 голосов
/ 10 марта 2020

Redis кэширует значение, запрошенное ранее, когда строка jdb c не содержит serverTimezone=Asia/Shanghai в строке запроса.

После использования serverTimezone=Asia/Shanghai и удаления кэша, оно может считывать дату с правильным часовым поясом.

Как MySQL Руководство разработчика по Connector / J 8.0 утверждает, что у него нет свойства useLegacyDatetimeCode , поэтому только serverTimezone=Asia/Shanghai требуется.

...