У меня для MySQL Server установлено UTC (@@ global.time_zone = '+00: 00') и таблица со столбцом DATETIME, в которой я храню даты в UTC. У меня проблемы с получением дат UTC, когда я вызываю хранимую процедуру через JDBC. Пример:
java.util.Date now = new java.util.Date();
sproc = conn.prepareCall("{call TzTestInsert(?)}");
sproc.setTimestamp(1, new java.sql.Timestamp(now.getTime()), Calendar.getInstance(TimeZone.getTimeZone("GMT+00:00")));
sproc.execute();
Спрокер TzTestInsert просто берет DATETIME и вставляет его в таблицу.
Я бы ожидал, что база данных будет содержать мое текущее время в UTC, но на самом деле оно содержит текущее время для моего часового пояса.
Если я изменю sproc на строку, это сработает ...
DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
dateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
...
sproc.setString(1, dateFormat.format(now));
но я бы предпочел использовать правильный тип в sproc.
Также работает, если я обойду sproc, но опять же не мое предпочтительное решение ...
String sql = "INSERT INTO TzTest VALUES('" + dateFormat.format(now) + "') ;
С исходным sproc у меня возникает та же проблема, если я использую тип данных TIMESTAMP в sproc и таблице, что неудивительно для сервера в UTC, поскольку любые преобразования часовых поясов, специфичные для MySQL TIMESTAMP, должны быть noops.
Вызов sproc из соединения MySQL Workbench работает нормально, например,
CALL TzTestInsert(UTC_TIMESTAMP());
Похоже, проблема в JDBC. Я просмотрел различные параметры подключения к часовому поясу и не нашел ничего, что имело бы значение.
Я, должно быть, упускаю что-то простое - многие люди делают это, верно?