ТЛ; др
java.sql.Date.valueOf(
LocalDate.parse( "12-Jan-23" , DateTimeFormatter.ofPattern( "dd-MMM-uuuu" , Locale.US ) )
)
Часовой пояс
Ваш код игнорирует критическую проблему часового пояса. Для определения даты требуется часовой пояс. В любой момент времени дата меняется по всему земному шару в зависимости от зоны.
Ваш код использует Date
, который всегда в UTC. Таким образом, ваше значение даты, полученное из класса Date
с неверным названием, будет точным для UTC, но недействительным для других часовых поясов, таких как America/Montreal
или Asia/Kolkata
.
Использование java.time
Современный способ выполнить эту работу - использовать классы java.time, которые вытесняют проблемные старые унаследованные классы даты и времени.
Класс LocalDate
представляет значение только для даты без времени суток и без часового пояса.
Чтобы проанализировать входящую строку, определите шаблон форматирования с помощью DateTimeFormatter
. Укажите Locale
для человеческого языка, который будет использоваться при переводе названия месяца.
DateTimeFormatter f = DateTimeFormatter.ofPattern( "dd-MMM-uuuu" , Locale.US );
LocalDate localDate = LocalDate.parse( "12-Jan-2017" , f );
В JDBC 4.2 и более поздних версиях LocalDate
можно напрямую передавать в базу данных с помощью методов setObject
и getObject
.
Если драйвер JDBC еще не обновлен, используйте типы java.sql.
java.sql.Date sqlDate = java.sql.Date.valueOf( localDate );
LocalDate localDate = sqlDate.toLocalDate();
О java.time
Фреймворк java.time встроен в Java 8 и более поздние версии. Эти классы вытесняют проблемные старые устаревшие классы даты и времени, такие как java.util.Date
, Calendar
и & SimpleDateFormat
.
Проект Joda-Time , находящийся сейчас в режиме обслуживания , рекомендует перейти на классы java.time .
Чтобы узнать больше, см. Oracle Tutorial . И поиск переполнения стека для многих примеров и объяснений. Спецификация JSR 310 .
Где получить классы java.time?
- Java SE 8 и SE 9 и более поздние
- Встроенный.
- Часть стандартного Java API с комплексной реализацией.
- Java 9 добавляет некоторые незначительные функции и исправления.
- Java SE 6 и SE 7
- Большая часть функциональности java.time перенесена в Java 6 & 7 в ThreeTen-Backport .
- Android
Проект ThreeTen-Extra расширяет java.time дополнительными классами. Этот проект является полигоном для возможных будущих дополнений к java.time. Здесь вы можете найти некоторые полезные классы, такие как Interval
, YearWeek
, YearQuarter
и more .