MySQL: значение даты в таблице отличается от значения в результате выбора из-за часового пояса - PullRequest
0 голосов
/ 26 февраля 2019

Я использую приложение на основе Java, которое обращается к MySQL через JDBC-коннектор.

Если я запускаю этот параметр, выберите в MySQL Workbench (где тип per_date_from равен DATE):

select per_date_from from formulas;

Я получаю одну строку:

1993-05-27

Теперь, если я запускаю этот код Java:

    stmt = conn.createStatement();
    ResultSet rs = stmt.executeQuery("select per_date_from from formulas");
    while (rs.next()) {
        java.sql.Date d = rs.getDate(1);
        System.out.println("d=" + d);
        java.sql.Timestamp ts = rs.getTimestamp(1);
        System.out.println("ts=" + ts);
    }

Я получаю этот результат в консоли:

09:35:51,412 INFO  [stdout] (default task-2) d=1993-05-26

09:35:51,412 INFO  [stdout] (default task-2) ts=1993-05-26 23:00:00.0

И код Java, и MySQL Workbench имеют следующую опцию подключения:

serverTimezone=America/New_York

Что происходит?Почему столбец типа DATE имеет время?

ОБНОВЛЕНИЕ

Версия сервера MySQL: 5.7.20

Версия JDBC-соединителя: 8.0.13

Согласно здесь они совместимы

1 Ответ

0 голосов
/ 28 февраля 2019

Есть идеи, что могло случиться?

Летнее время.serverTimezone=America/New_York говорит MySQL, Connector / J, чтобы использовать тот часовой пояс, который наблюдает летнее время.Однако ваша JVM использует GMT-05:00, что является фиксированным смещением и не соответствует DST.Так что, если ДАТА MySQL происходит в период, когда Нью-Йорк находится по восточному летнему времени, то Timestamp будет на час выключен ...

sql = "SELECT CAST('1993-05-27' AS DATE)"; 
ResultSet rs = st.executeQuery(sql);
rs.next();
Timestamp t = rs.getTimestamp(1);
System.out.println(t);  // 1993-05-26 23:00:00.0

... тогда как, если дата была во времяпериод, когда Нью-Йорк был по восточному поясному времени, тогда Timestamp будет содержать правильную дату:

sql = "SELECT CAST('1993-01-27' AS DATE)"; 
ResultSet rs = st.executeQuery(sql);
rs.next();
Timestamp t = rs.getTimestamp(1);
System.out.println(t);  // 1993-01-27 00:00:00.0

Мораль истории:

Прекратить использование java.sql.Timestamp.Для типов столбцов, таких как DATE и DATETIME, которые не содержат информацию о часовом поясе, используйте java.time.LocalDate и java.time.LocalDateTime.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...