Преобразовать строку в объект java.sql.Date в формате "ГГГГ"
Я хочу создать объект java.sql.Date в формате "YYYY". Должен быть только год. Я много исследовал, но не мог найти способ сделать это.
2 ответа
ТЛ; др
Никогда не используйте ужасное java.sql.Date
класс, плохо спроектированный с множественными недостатками.
Используйте либо java.time.Year
объект или целое число.
myPreparedStatement.setObject( … , Year.of( 2018 ) ) ;
... или при использовании Year
в других частях вашего кода:
myPreparedStatement.setInt( … , Year.of( 2018 ).getValue() ) ;
java.time
Современное решение использует классы java.time, которые много лет назад вытеснили ужасные старые классы даты и времени. SimpleDateFormat
, java.util.Date
, java.sql.Date
, и так далее.
Year
класс аккуратно представляет значение года. Использование этого класса в вашем коде обеспечивает безопасность типов и делает ваш код более самодокументируемым.
Разбор строки ввода.
Year y = Year.parse( "2018" ) ;
Разбор целочисленного ввода.
Year y = Year.of( 2018 ) ; // Integer literal.
JDBC
Начиная с JDBC 4.2 мы можем напрямую обмениваться типами java.time.
обмен Year
объект
Я не знаю, включает ли это Year
класс и YEAR
Тип данных в MySQL. Но дай ему шанс. Если нет, отправьте запрос функции вашему поставщику драйвера JDBC для расширения поддержки. Кажется оправданным ожиданием, учитывая тот факт, что MySQL имеет явный YEAR
тип.
myPreparedStatement.setObject( … , y ) ;
Индексирование.
Year y = myResultSet.getObject( … , Year.class ) ;
Обменное число
Если ваш драйвер JDBC не может использовать java.time.Year
напрямую, используйте целое число.
myPreparedStatement.setInt( … , y.getValue() ) ; // Pass year as an integer number.
Индексирование.
Year y = Year.of( myResultSet.getInt( … ) ) ; // Retrieve integer, convert to `Year` object.
О java.time
Инфраструктура java.time встроена в Java 8 и более поздние версии. Эти классы вытесняют проблемные старые классы даты и времени, такие как java.util.Date
, Calendar
& SimpleDateFormat
,
Проект Joda-Time, находящийся сейчас в режиме обслуживания, рекомендует перейти на классы java.time.
Чтобы узнать больше, смотрите Oracle Tutorial. И поиск переполнения стека для многих примеров и объяснений. Спецификация JSR 310.
Вы можете обмениваться объектами java.time напрямую с вашей базой данных. Используйте драйвер JDBC, соответствующий JDBC 4.2 или более поздней версии. Нет необходимости в строках, нет необходимости в java.sql.*
классы.
Где взять классы java.time?
- Java SE 8, Java SE 9, Java SE 10, Java SE 11 и более поздние версии - часть стандартного API Java со встроенной реализацией.
- Java 9 добавляет некоторые незначительные функции и исправления.
- Java SE 6 и Java SE 7
- Большая часть функциональности java.time перенесена на Java 6 и 7 в ThreeTen-Backport.
- Android
- Более поздние версии Android связывают реализации классов java.time.
- Для более ранних версий Android (<26) проект ThreeTenABP адаптирует ThreeTen-Backport (упомянутый выше). Смотрите Как использовать ThreeTenABP….
Проект ThreeTen-Extra расширяет java.time дополнительными классами. Этот проект является полигоном для возможных будущих дополнений к java.time. Вы можете найти некоторые полезные классы здесь, такие как Interval
, YearWeek
, YearQuarter
и многое другое.
Вам нужно создать java.util.Date
а затем преобразовать это в java.sql.Date
используя конструктор, который принимает в long
,
Пример:
String year = "2018";
DateFormat format = new SimpleDateFormat("yyyy");
java.util.Date utilDate = format.parse(year);
java.sql.Date sqlDate = new java.sql.Date(utilDate.getTime());
Однако это не "только год". Даты в Java всегда имеют компонент времени, поэтому это невозможно - в моем примере это будет "1 января 2018 00:00:00 GMT". Это достаточно близко к тому, что вы хотите, или вы могли бы уточнить свой вопрос?
Кроме того, java.sql.Date
продолжается java.util.Date
так что в идеале вы должны использовать первое, где это возможно, для удовлетворения принципа подстановки Лискова.