Преобразовать строку в объект java.sql.Date в формате "ГГГГ" - PullRequest
0 голосов
/ 19 ноября 2018

Я хочу создать объект java.sql.Date в формате "YYYY". Должен быть только год. Я много исследовал, но не мог найти способ сделать это.

Ответы [ 2 ]

0 голосов
/ 20 ноября 2018

ТЛ; др

Никогда не используйте ужасный класс 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.

1034 * 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 и более поздние версии - часть стандартного Java API с связанной реализацией. Java 9 добавляет некоторые незначительные функции и исправления. Java SE 6 и Java SE 7 Большинство функций java.time перенесены на Java 6 и 7 в ThreeTen-Backport . Android Более поздние версии реализаций комплекта Android классов java.time . Для более ранних версий Android (<26) проект <a href="https://github.com/JakeWharton/ThreeTenABP" rel="nofollow noreferrer"> ThreeTenABP адаптируется ThreeTen-Backport (упомянуто выше). См. Как использовать ThreeTenABP… . Проект ThreeTen-Extra расширяет java.time дополнительными классами. Этот проект является полигоном для возможных будущих дополнений к java.time. Здесь вы можете найти несколько полезных классов, таких как Interval, YearWeek, YearQuarter и more .

0 голосов
/ 19 ноября 2018

Вам необходимо создать 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 по Гринвичу».Это достаточно близко к тому, что вы хотите, или вы могли бы уточнить свой вопрос?

Кроме того, java.sql.Date расширяет java.util.Date, поэтому в идеале вы должны использовать первое, где это возможно, для удовлетворения принципа подстановки Лискова.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...