Не форматируйте дату для вставки в базу данных SQL.Предполагая, что столбец вашей базы данных имеет тип данных date
и вы используете по крайней мере Java 8 и по крайней мере JDBC 4.2, просто передайте LocalDate
вашему PreparedStatement
, как это:
PreparedStatement insertStmt = myConnection.prepareStatement(
"insert into my_table(purchase_date) values (?)");
insertStmt.setObject(1, purchaseDate);
Ваш JDBCводитель позаботится обо всем остальном.Если вы используете JPA, ваша реализация JPA также позаботится об этом.
Если у вашего столбца есть тип символа (например, varchar(10)
), и вы не можете изменить его, не придумывайте для него свой собственный формат.Сохраните дату в формате ISO 8601.LocalDate.toString()
создает этот формат.
String formattedDate = purchaseDate.toString();
System.out.println(formattedDate);
В моем случае вывод был:
2017-11-29
В сторону, дляпрезентации для вашего пользователя, вы не должны изобретать свой собственный формат.Скорее полагайтесь на встроенные форматы в Java.Например:
Locale turkish = Locale.forLanguageTag("tr");
DateTimeFormatter dateFormatter = DateTimeFormatter.ofLocalizedDate(FormatStyle.SHORT)
.withLocale(turkish);
String formattedDate = purchaseDate.format(dateFormatter);
System.out.println(formattedDate);
Вывод:
29.11.2017
Что не так в вашем коде?
Естьдве неправильные вещи:
Вы использовали строчные буквы mm
.Это означает минуту часа, и, поскольку LocalDate
не имеет времени суток, оно выдает исключение, которое вы видели.Полученное сообщение является довольно точным:
Неподдерживаемое поле: MinuteOfHour
Вместо этого вы можете использовать прописные буквы MM
для двузначного месяца.
Вам нужно выбрать формат в String
, возвращенном методом format
.LocalDate
является неизменным и поэтому не зависит от вызова метода.Также он не может иметь формат в нем.Это просто дата в календаре.
Ссылка: Статья в Википедии: ISO 8601