Мне нужно сохранить в БД локальную дату(не указывая часовой пояс). В моей программе на 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);
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Виртуальный выделенный сервер (VDS) становится отличным выбором
test1 - это переменная экземпляра? Не могу понять что такое переменная экземпляра :(
У меня в программе возникает ошибка, которая формирует stackTrace очень большой и с разными библиотекамиЕсли читать его сверху вниз, то можно...
Вот возникает следующая ошибка при выполнении программыКак мне ее избежать, помогите пожалуйста?