Во-первых, вы не должны получать дату как String
из базы данных Postgres. Вы должны получить его как объект типа, представляющего дату.
Во-вторых, хотя в 2013 году использование Date
и SimpleDateFormat
было обычным и разумным, дни прошли, и появились новые и более совершенные классы даты и времени, которые вошли в широкое употребление. ИМХО никто больше не должен использовать старые классы, и я считаю их давно устаревшими.
Чтобы получить объект LocalDate
из вашего ResultSet
из вашей базы данных:
LocalDate da = yourResultSet.getObject(3, LocalDate.class);
(Я предполагаю, что дата указана в столбце 3 запроса).
Чтобы отформатировать его в dd-MM-yyyy
:
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-MM-uuuu");
String strDateTime = da.format(formatter);
System.out.println("==String date is : " + strDateTime);
Это даст результат вроде
==String date is : 21-02-2013
Наконец, если у вас есть строка, как в вопросе, и вы хотите переформатировать ее в желаемый формат:
String strDate = "2013-02-21";
LocalDate da = LocalDate.parse(strDate);
System.out.println("==Date is ==" + da);
Это печатает
==Date is ==2013-02-21
Я использую тот факт, что строка соответствует стандартному формату даты ISO 8601, который используется по умолчанию для современных классов даты и времени. Таким образом, в этом случае нам не нужен явный модуль форматирования для синтаксического анализа, как для синтаксического анализа других форматов.
Форматирование в желаемый формат происходит точно так же, как и раньше.
Пример беды со старыми классами
На моем компьютере вывод кода в вопросе
==Date is ==Tue Aug 06 00:00:00 CET 26
==String date is : 06-08-0026
Вы явно получаете неправильный результат и не понимаете, что было не так. Что было неправильно, так это то, что вы анализировали строку даты в базе данных 2013-02-21
с помощью средства форматирования, предназначенного для новой строки, dd-MM-yyyy
. Таким образом, он анализируется как 21 февраля 2013 года нашей эры. В феврале нет 2013 дней? Нет проблем для SimpleDateFormat
с настройками по умолчанию, он просто продолжает отсчет дней в следующие месяцы и годы и заканчивается 6 августа, пять с половиной лет спустя, но все еще очень рано в истории.
Если мы попробуем сделать то же самое с современными классами:
LocalDate.parse(strDate, formatter);
- получаем java.time.format.DateTimeParseException: Text '2013-02-21' could not be parsed at index 2
. Это связано с тем, что модуль форматирования указал день из двух цифр, поэтому, когда после анализа двух цифр во входной строке появляется больше цифр, это является ошибкой и сообщается как таковая. Считаю такое поведение более правильным и полезным.
person
Ole V.V.
schedule
30.06.2017