Мне нужно сохранить в БД локальную дату(не указывая часовой пояс). В моей программе на 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);
Но результат остался прежним.
Почему при вставке изменяется дата, и как решить эту проблему?
В итоге решил проблему следующим способом:
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
String formattedDate = dateTimeFormatter.format(date);
s.setString(parameterIndex, formattedDate);
Продвижение своими сайтами как стратегия роста и независимости