Преобразовать тип ввода HTML DATE в MYSQL DATE - PullRequest
0 голосов
/ 19 февраля 2019

возникают трудности с преобразованием объектов даты и назад в HTML / Java / SQL:

У меня есть класс, который содержит тип объекта LocalDate.

С HTML пользователь вводит мм / дд / гггг, как 01/19/1993

Но MYSQL принимает только формат даты гггг-ММ-дд

Поэтому я получаю свойdate как часть httpservletrequest и попытайтесь преобразовать туда и обратно при добавлении в базу данных или загрузку из.

Любая помощь очень ценится.

HTML:

<form action="PaymentControllerServlet" method="GET">
                <input type="hidden" name="command" value="ADD" />

                <table>
                    <tbody>
                        <tr>
                            <td><label>Company Name:</label></td>
                            <td><input type="text" name="companyName" /></td>
                        </tr>
                        <tr>
                            <td><label>Company Phone:</label></td>
                            <td><input type="text" name="companyNumber" /></td>
                        </tr>
                        <tr>
                            <td><label>Bill Amount:</label></td>
                            <td><input type="text" name="paymentAmount" /></td>
                        </tr>
                        <tr>
                            <td><label>Due Date:</label></td>
                            <td><input type="date" name="paymentDueDate" /></td>
                        </tr>

Java:

// 1)Retrieve date as a String, parse the String into actual Date object
        Date  date1 = new SimpleDateFormat("MM-dd-yyyy").parse(request.getParameter("paymentDueDate"));

        // 2)Create a new DateFormat("yyyy-MM-dd") - For mySQL format
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");

        // 3)Convert my Date obj into String, and change to ("yyyy-MM-dd") format

        String myStringdate = sdf.format(date1);

        // 4)Convert String back to date obj

        Date finishedDate = (Date)sdf.parse(myStringdate);

        // 5)Convert to localDate
        LocalDate dueDate = finishedDate.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
        // 6)Send to MYSQL database. 
        //Initial user html input = 01/19/1993, 
        //date entered in mysql database = 0184-12-31

1 Ответ

0 голосов
/ 19 февраля 2019

Умные объекты, а не тупые струны

Хватит крутить колеса, манипулируя струнами.Используйте объекты при взаимодействии с вашей базой данных.

Никогда не используйте Date или SimpleDateFormat.Используйте только java.time классы.

Начиная с JDBC 4.2 , мы можем напрямую обмениваться некоторыми типами java.time с базой данных.

Сначала проанализируйте введенную строку.

String input = "01/23/2019";
DateTimeFormatter f = DateTimeFormatter.ofPattern( "MM/dd/uuuu" ) ;
LocalDate ld = LocalDate.parse( input , f ) ;

Передайте через заполнитель ? в подготовленном выражении.

myPreparedStatement.setObject( … , ld ) ;

Извлечение.

LocalDate ld = myResultSet.getObject( … , LocalDate.class ) ;

Все это уже много раз освещалось на Stack Exchange.Поиск, чтобы узнать больше.


О java.time

Встроенный фреймворк java.time Ява 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 и JavaSE 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 .

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