在 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
最佳答案
智能对象,而不是哑字符串
停止转动你的轮子来操纵琴弦。在与数据库交互时使用对象。
切勿使用 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 driver符合 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
- 在 ThreeTen-Backport 中,大部分 java.time 功能都向后移植到 Java 6 和 7。 .
- > Android
- 更高版本的 Android bundle 实现 java.time 类。
- 对于早期的 Android (<26),ThreeTenABP项目改编ThreeTen-Backport (上文提到的)。参见 How to use ThreeTenABP… .
ThreeTen-Extra项目用附加类扩展 java.time。该项目是 future 可能添加到 java.time 的试验场。您可能会在这里找到一些有用的类,例如 Interval
, YearWeek
, YearQuarter
, 和 more .
关于java - 将 HTML 输入类型 DATE 转换为 MYSQL DATE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54773671/