【问题标题】:How can i get input type "date" value from html form into java variable and SQL date format?如何将输入类型“日期”值从 html 表单转换为 java 变量和 SQL 日期格式?
【发布时间】:2026-02-03 22:35:01
【问题描述】:

我尝试在servlet类中使用request.getParameter()获取html输入类型“日期”的值,在JDBC类中将其转换为java日期,然后转换为sql日期格式。

但是有这个异常 java.text.ParseException: Unparseable 日期。

这是日期的 HTML 标记

input type="date" name="BirthDate"

这是从 HTML 页面获取值的 servlet 代码

String bDate = request.getParameter("BirthDate");

这是转换它的 JDBC 类代码

String bbd = user.getBDate();
DateFormat df = new SimpleDateFormat("dd/MM/yyy");
java.util.Date bbDate = df.parse(bbd);;
java.sql.Date bDate = new java.sql.Date(bbDate.getTime());

【问题讨论】:

  • 输入字段中输入了什么?如果您至少使用 Java 8 和 JDBC 4.2,最好使用 DateTimeFormatter 解析成 LocalDate。您可以将LocalDate 直接保存到您的SQL 数据库中,这样就节省了一次转换。此外,这两个 Date 类早已过时且设计不佳,因此您将拥有所有优势。
  • 几点,A 你的简单日期格式有 3 个而不是 4 个 y。 B 我建议在日期上使用 LocalDate。最后,如果您使用它来编写 sql,则 sql.Date 字段将在查询中接受 LocalDate 的 toString。
  • 仅供参考,非常麻烦的旧日期时间类,例如 java.util.Datejava.util.Calendarjava.text.SimpleDateFormat,现在是 legacy,被 Java 8 中内置的 java.time 类所取代,之后。见Tutorial by Oracle

标签: java html sql unparseable


【解决方案1】:

tl;博士

myPreparedStatement.setObject(                       // As of JDBC 4.2, pass java.time objects to your database.
    … ,
    LocalDate                                        // Represent a date-only value, without time-of-day and without time zone.
    .parse(                                          // Convert text to a `LocalDate` object.
        "23/01/2018" ,
        DateTimeFormatter.ofPattern( "dd/MM/uuuu" )  // Specify formatting pattern to match user input.
    )                                                // Returns a `LocalDate` object.
)

java.time

仅使用 java.time 类。切勿使用java.util.Datejava.sql.DateCalendarSimpleDateFormat

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

从 JDBC 4.2 开始,我们可以直接与数据库交换 java.time 对象。

myPreparedStatement.setObject( … , ld ) ;

检索。

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

关于java.time

java.time 框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧 legacy 日期时间类,例如 java.util.DateCalendarSimpleDateFormat

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 的试验场。您可以在这里找到一些有用的类,例如IntervalYearWeekYearQuartermore

【讨论】: