Как мне справиться с переходом на летнее время при работе с базой данных через JDBC? - PullRequest
2 голосов
/ 24 октября 2019

Мой сервер MySQL настроен на использование UTC (default-time-zone = «00:00» в my.cnf), и я добавил «serverTimezone = UTC» в URL источника данных.

Как яПонимаете, это означает 2 вещи:

  1. Сервер MySQL хранит любые данные даты / времени в зоне UTC;
  2. JDBC знает это.

Предположим, у меня есть некоторый класс Dao с полем LocalDateTime:

class MyDataDao {
    public LocalDateTime theDate = LocalDateTime.parse("2020-01-10T10:00:00");
    // some other fields ...
}

И затем я хочу вставить MyDataDao в базу данных:

m_jdbc.update(new PreparedStatementCreator() {
    @Override
    public PreparedStatement createPreparedStatement(Connection connection) throws SQLException {
        PreparedStatement ps = connection.prepareStatement(SQL_ADDMYDATA, Statement.RETURN_GENERATED_KEYS);
        //... some other fields ...

        // the date time field
        ps.setObject(3, myData.getTheDate());
        return ps;
    }
}, genKey);

Теперь, когда возникли вопросы:

Я запросил базу данных в CLI, это было «2020-01-10 09: 00: 00 ».

Я нахожусь в Центральной Европе, поэтому мой «стандартный» часовой поясэто "UTC + 1". Казалось, что JDBC автоматически изменил «theDate» с «UTC + 1» на «UTC».

Однако я знаю, что сейчас летнее время, поэтому практический часовой пояс на самом деле - «UTC». +2" . К сожалению, JDBC не принял это во внимание.

Вопросы:

  1. Правильно ли все мое понимание выше?
  2. Как я могу сделатьJDBC учитывает DST?

(я пробовал TimeZone.setRawOffset (...), но это не помогло. Я знаю, что могу вручную сдвинуть поле "theDate" перед отправкойв JDBC, но я думаю, что это определенно не лучшая практика)

Спасибо!

1 Ответ

2 голосов
/ 24 октября 2019

На самом деле часовой пояс, который будет применяться, всегда будет зависеть от перехода на летнее время, используемого в данный момент, с учетом вашей даты, а не от текущего перехода на летнее время, с примером всегда проще:

Допустим, ясоздал документ в моей базе данных с датой создания столбца, содержащей значение 01/01/2019-12:00:00 UTC.

  • Когда я запрашиваю документ 02/02/2019 (в настоящее время смещение часового пояса в Париже составляет UTC + 1), возвращаемый документ будет иметь следующее значение "01/01 /2019-13: 00: 00 Париж ".
  • Когда я запрашиваю тот же документ, 01/08/2019 (в настоящее время используемое смещение часового пояса в Париже составляет UTC + 2), затем также будет возвращаться 01/01 / 2019-13: 00: 00 Paris.

Таким образом, примененное смещение часового пояса зависит от вашего часового пояса и перехода на летнее время в момент, на который ссылается ваш объект даты.

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