【问题标题】:Convert HTML Input type DATE to MYSQL DATE将 HTML 输入类型 DATE 转换为 MYSQL DATE
【发布时间】:2019-07-13 09:28:50
【问题描述】:

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

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

使用 HTML,用户输入一个 mm/dd/yyyy,例如 01/19/1993

但是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

【问题讨论】:

  • 在传递给mysql的时候不要把你的日期变成字符串;使用具有日期类型参数的参数化查询,并传递您从 http 查询字符串表示中解析的 java 日期
  • 您能否阐明您的解决方案或发布一个我可以修改的示例 sn-p?
  • 我建议你不要使用Date 和SimpleDateFormat。这些类设计不佳且早已过时,后者尤其是出了名的麻烦。而是使用来自java.time, the modern Java date and time API 的LocalDate 和DateTimeFormatter。

标签: java html mysql date


【解决方案1】:

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

停止转动你的轮子来操纵琴弦。在与数据库交互时使用对象。

切勿使用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 框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧 legacy 日期时间类,例如 java.util.Date、Calendar 和 SimpleDateFormat。

Joda-Time 项目现在位于maintenance mode,建议迁移到java.time 类。

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

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

从哪里获得 java.time 类?

ThreeTen-Extra 项目通过附加类扩展了 java.time。该项目是未来可能添加到 java.time 的试验场。您可以在这里找到一些有用的类,例如Interval、YearWeek、YearQuarter 和more。

【讨论】:

    猜你喜欢
    • 2017-12-18
    • 1970-01-01
    • 2018-04-04
    • 1970-01-01
    • 2019-08-17
    • 1970-01-01
    • 1970-01-01
    • 2014-06-05
    • 1970-01-01
    相关资源
    最近更新 更多