在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
答案 0 :(得分:4)
停止旋转操纵弦的车轮。与数据库交互时使用对象。
请勿使用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 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类?
ThreeTen-Extra项目使用其他类扩展了java.time。该项目为将来可能在java.time中添加内容提供了一个试验场。您可能会在这里找到一些有用的类,例如Interval
,YearWeek
,YearQuarter
和more。