Как изменить часовой пояс MySQL в соединении с базой данных с помощью Java?

MySQL работает с часовым поясом "GMT + 8", но Tomcat с "GMT". Когда я сохраняю datetime в моей базе данных, все кажется ОК, но когда я проверяю значение datetime в базе данных, я вижу значение "GMT".

Также, когда я пытаюсь получить значение из базы данных, значение изменяется, похоже, что значение в базе данных принято как "GMT + 8", поэтому Java изменяет значение на "GMT".

Я установил URL-адрес соединения следующим образом:

useTimezone=true&serverTimezone=GMT

Но это не работает.

Ответ 1

useTimezone - это более раннее решение. Команда MySQL переписала код setTimestamp/getTimestamp довольно недавно, но она будет включена, только если вы установили параметр соединения useLegacyDatetimeCode = false, и вы используете последнюю версию соединителя JDBC mysql. Так, например:

String url =
 "jdbc:mysql://localhost/mydb?useLegacyDatetimeCode=false

Если вы загрузите исходный код mysql-коннектора и посмотрите на setTimestamp, очень легко увидеть, что происходит:

Если используется устаревшая дата time code = false, вызывается newSetTimestampInternal (...). Затем, если Календарь, переданный newSetTimestampInternal, равен NULL, ваш объект даты форматируется в часовом поясе базы данных:

this.tsdf = new SimpleDateFormat("''yyyy-MM-dd HH:mm:ss", Locale.US);
this.tsdf.setTimeZone(this.connection.getServerTimezoneTZ());
timestampString = this.tsdf.format(x);

Очень важно, чтобы календарь был нулевым, поэтому убедитесь, что вы используете:

setTimestamp(int,Timestamp).

... NOT setTimestamp (int, Timestamp, Calendar).

Теперь должно быть очевидно, как это работает. Если вы построите дату: 5 января 2011 г. 3:00 в Америке /Los _Angeles (или любой другой часовой пояс, который вы хотите), используя java.util.Calendar и call setTimestamp (1, myDate), тогда он примет вашу дату, используйте SimpleDateFormat для его форматирования в часовом поясе базы данных. Поэтому, если ваша БД находится в Америке /New _York, она будет построена String '2011-01-05 6:00:00', которая будет вставлена ​​(поскольку NY опережает LA на 3 часа).

Чтобы получить дату, используйте getTimestamp (int) (без календаря). Еще раз он будет использовать часовой пояс базы данных для создания даты.

Примечание: Часовой пояс веб-сервера теперь совершенно неактуальен! Если вы не установите для useLegacyDatetimecode значение false, то часовой пояс webserver используется для форматирования - добавление большого количества путаницы.


Примечание:

Возможно, MySQL мой жалуется, что часовой пояс сервера неоднозначен. Например, если ваша база данных настроена на использование EST, в Java может быть несколько возможных часовых поясов EST, поэтому вы можете пояснить это для mysql-коннектора, указав точно, что такое часовой пояс базы данных:

String url =
 "jdbc:mysql://localhost/mydb?useLegacyDatetimeCode=false&serverTimezone=America/New_York";

Вам нужно только сделать это, если он жалуется.

Ответ 2

JDBC использует так называемый "URL-адрес соединения", поэтому вы можете экранировать "+" на "%2B", то есть

useTimezone=true&serverTimezone=GMT%2B8

Ответ 3

Я столкнулся с этой проблемой, когда я обновил свой сервер MySQL до SQL Server 8.0 (MYSQL80).

Самое простое решение этой проблемы - просто напишите приведенную ниже команду в вашем MYSQL Workbench -

  SET GLOBAL time_zone = '+5:30'

Для IST я использую часовой пояс как +5: 30, вам нужно изменить его соответственно в соответствии с вашим часовым поясом. Это решит проблему.