Как изменить часовой пояс mysql в java-соединении

Mysql работает в GMT + 8, но tomcat работает в GMT. при сохранении datetime в базе данных, кажется, запускается нормально, когда я проверяю значение datetime в БД, я вижу значение GMT. Но когда я пытаюсь получить значение из БД, значение изменяется, кажется, что значение в БД принимается за GMT + 8, поэтому java меняет значение на GMT.

Я пытаюсь установить URL-адрес соединения

useTimezone=true&serverTimezone=GMT 

но не работает

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

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

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

Если используется устаревший временной код даты = 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 мой жалуется, что часовой пояс сервера неоднозначен. Например, если ваша firebase database настроена на использование EST, в Java может быть несколько возможных часовых поясов EST, поэтому вы можете пояснить это для mysql-коннектора, указав точно, что такое часовой пояс базы данных:

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

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

  • Как хранить дату и время и временные метки в часовом поясе UTC с JPA и Hibernate
  • Как получить текущую дату и время вашего часового пояса в Java?
  • Часовой пояс с рельсами 3
  • Временные зоны MySQL
  • Преобразование между локальными временами и GMT / UTC в C / C ++
  • Как элегантно работать с часовыми поясами
  • Как обрабатывать календарные часовые пояса с помощью Java?
  • Как установить часовой пояс по умолчанию в node.js?
  • Получение системных часовых поясов на разных языках
  • Параметр DateTime с часовым поясом формы PST / CEST / UTC / etc.
  • Как использовать TimeZoneInfo для получения местного времени во время летнего времени?
  • Давайте будем гением компьютера.