Как запретить Mysql Connector / J преобразовывать DATE и TIME часовой пояс? - PullRequest
0 голосов
/ 22 января 2020

Я подключаюсь к mysql серверу, используя следующий DSN: jdbc:mysql://localhost/my_database?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC.

Проблема, которую я получаю, состоит в том, что экземпляр java.sql.Date получает часовой пояс, преобразованный в UT C из мой местный часовой пояс. Мое приложение обрабатывает даты как часовые пояса c, и это вызывает несколько проблем.

Например, я нахожусь в IST (UTC + 05: 30), когда я устанавливаю поле даты, чтобы сказать '2020 -01-22 'в коде, он отправляется на сервер как' 2020-01-21 '. Я подтвердил это из общего журнала mysql.

Я пробовал несколько комбинаций useLegacyDatetimeCode, useTimezone и noTimezoneConversionForDateType, но до сих пор не смог получить mysql драйвер для пропуска преобразования поля даты.

Как получить драйвер mysql, чтобы пропустить преобразование для полей даты и времени?

Я пробовал обе версии 6 и 8 из Разъем / J драйвера mysql:mysql-connector-java:<version>. Кроме того, я использую JOOQ и использую простой конвертер для преобразования между LocalDate и java.sql.Date.

Ответы [ 2 ]

0 голосов
/ 27 января 2020

У меня была та же проблема, и я решил ее с помощью этого конвертера:

public final class DateConverter implements Converter<Date, LocalDate> {
    @Override
    public final LocalDate from(final Date value) {
        if(null == value) {
            return null;
        } else {
            return value.toLocalDate();
        }
    }

    @Override
    public final Date to(final LocalDate value) {
        if(null == value) {
            return null;
        } else {
            return new Date(value.atStartOfDay(ZoneOffset.UTC).toInstant().toEpochMilli());
        }
    }

    @Override
    public final Class<Date> fromType() {
        return Date.class;
    }

    @Override
    public final Class<LocalDate> toType() {
        return LocalDate.class;
    }
}

Я должен признать, что я еще не думал о поведении, если этот конвертер используется с разными часовыми поясами ...

0 голосов
/ 22 января 2020

Если вы действительно хотите иметь дату в «часовом поясе» c, вам нужно будет использовать LocalDate в пределах Java. LocalDate очень хорошо отображается на MySQL * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * '' '' заменим его. на всех.

...