将HTML输入类型DATE转换为MYSQL DATE

时间:2019-02-19 19:33:05

标签: java html mysql date

在HTML / Java / SQL中来回转换日期对象有困难:

我有一个包含对象类型LocalDate的类。

使用HTML,用户输入mm / dd / yyyy,如1993年1月19日

但是MYSQL仅接受日期格式yyyy-MM-dd

因此,我将日期作为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 :(得分:4)

智能对象,而不是哑字符串

停止旋转操纵弦的车轮。与数据库交互时使用对象。

请勿使用DateSimpleDateFormat。仅使用 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框架已内置在Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendarSimpleDateFormat

目前位于Joda-Timemaintenance mode项目建议迁移到java.time类。

要了解更多信息,请参见Oracle Tutorial。并在Stack Overflow中搜索许多示例和说明。规格为JSR 310

您可以直接与数据库交换 java.time 对象。使用符合JDBC driver或更高版本的JDBC 4.2。不需要字符串,不需要java.sql.*类。

在哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展了java.time。该项目为将来可能在java.time中添加内容提供了一个试验场。您可能会在这里找到一些有用的类,例如IntervalYearWeekYearQuartermore