Вставка java.time.LocalDate в MySQL с использованием JDBC

127
21 января 2020, 18:00

Мне нужно сохранить в БД локальную дату(не указывая часовой пояс). В моей программе на java эта дата храниться в java.time.LocalDate. В MySQL эта дата хранится в типе данных DATE.

Я использую DATE и java.time.LocalDate потому что, насколько я понял из документации, эти типы данных не сохраняют никакой информации про часовой пояс, а хранят только день, месяц и год.

Я работаю с БД через JDBC, через mysql-connector-java версии 8.0.15. Вставка делается через PreparedStatement. Упрощенный код запроса такой:

String INSERT_QUERY = "INSERT INTO local_dates VALUES (?)"

Значение параметра я устанавливаю через setDate

LocalDate localDate = ...;
PreparedStatment s = connection.prepareStatement(INSERT_QUERY);
s.setDate(1, Date.valueOf(localDate));

Но в БД вставляется не та дата, что я указываю. Например, если в переменной localDate лежит '2019-04-15' то в базу попадает '2019-04-14'. То есть дата уменьшается на один день.

Изначально я думал что проблема в использовании java.sql.Date.valueOf, ведь java.sql.Date внутри использует устаревший java.util.Date. Прочитав что спецификация JDBC начиная с версии 4.2 поддерживает работу с классами java.time, я попытался использовать вместо setDate методsetObject:

s.setObject(1, localDate);

Но результат остался прежним.

Почему при вставке изменяется дата, и как решить эту проблему?

Answer 1

В итоге решил проблему следующим способом:

DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
String formattedDate = dateTimeFormatter.format(date);
s.setString(parameterIndex, formattedDate);
READ ALSO
переменная экземпляра == объект?

переменная экземпляра == объект?

test1 - это переменная экземпляра? Не могу понять что такое переменная экземпляра :(

148
Как получить полный StackTrace

Как получить полный StackTrace

У меня в программе возникает ошибка, которая формирует stackTrace очень большой и с разными библиотекамиЕсли читать его сверху вниз, то можно...

150
Возникает ошибка OutOfMemoryError

Возникает ошибка OutOfMemoryError

Вот возникает следующая ошибка при выполнении программыКак мне ее избежать, помогите пожалуйста?

110