Ответ 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";
Вам нужно только сделать это, если он жалуется.