我正在处理一些现有代码。有3个字段使用 JavaScript日期选择器并将其设置为bean的java.util.Date
。
我添加了一个名为reportPeriod(java.util.Date)
的新字段。当我在调试器中读取此日期时,它的类型为"Thu Jul 31 00:00:00 EDT 2014"
。在屏幕上执行保存时,bindingPreparation
方法已完成。这里绑定了java.util.Date
类型的所有字段。由于3个日期字段是由JavaScript设置的,因此它们都是"mm/dd/yyyy"
形式。 bindingPreparation
方法将这些日期作为字符串并尝试解析它们。它在报告期间失败。
我希望能够使用此字符串"Thu Jul 31 00:00:00 EDT 2014"
并将其转换为格式mm/dd/yyyy
的相应日期。我尝试使用SimpleDateFormat
,但无法使用。
我的另一个选择是将其设为java.sql.Date
,以便它不会通过绑定准备方法。但是,出现的问题是我将此报告期作为隐藏字段传递,并且我收到错误消息,指出无法将字符串转换为日期。
这就是我隐藏字段的方式:我通过将reportPeriodDate
添加到模型视图中来传递<input type="hidden" name="companyLot[${Index.index}].reportPeriodDate" value="${reportPeriodDate}"/>
。
@InitBinder
public void bindingPreparation(WebDataBinder binder){
CompCustomDateEditor customDateEditor=new CompCustomDateEditor();
binder.registerCustomEditor(java.util.Date.class, customDateEditor);
更新: Binding方法如下:
public class CompCustomDateEditor extends PropertyEditorSupport {
public void setAsText(String text) throws IllegalArgumentException {
if(!StringUtility.isNullOrEmpty(text))
{
StringTokenizer str=new StringTokenizer(StringUtility.trim(text),"/");
StringBuffer dateString=new StringBuffer();
while(str.hasMoreTokens())
{
dateString=dateString.append(str.nextToken());
}
StringBuffer dateStringNew=new StringBuffer();
String tmp = dateString.substring(4,8).replace(",","");
//dateStringNew=dateStringNew.append(dateString.substring(4,8));
dateStringNew=dateStringNew.append(tmp);
dateStringNew.append("-");
dateStringNew.append(dateString.substring(0, 2));
dateStringNew.append("-");
String monthStr = dateString.substring(2, 4);
//dateStringNew.append(dateString.substring(2, 4));
dateStringNew.append(monthStr);
SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd");
try {
//java.util.Date customDate=dateFormat.parse(dateString.toString());
java.util.Date customDate=dateFormat.parse(dateStringNew.toString());
setValue(customDate);
} catch (ParseException e) {
e.printStackTrace();
}
}
}
此CompCustomDateEditor是由其他人编写的,他假设所有日期都是使用dd / mm / yyyy类型的日期选择器从javascript输入的。这个cutomDateEditor所做的就是将日期拆分为月份日期,然后使用格式yyyy-mm-dd创建日期。所以我的代码失败的原因是它尝试解析这个字符串&#34; Thu Jul 31 00:00:00 EDT 2014&#34;。因此,我想以某种方式使这个字符串到2014年7月31日。不知道怎么回事。
这是customDateEditor
{{1}}
答案 0 :(得分:0)
您最好的选择是将模型中的 reportPeriodDate 设置为 bindingPrepartion 方法识别的字符串,SimpleDateFormat
绝对适用于此,注意你应该使用大写的M
,低级的是指分钟。因此,如果 reportPeriodDate 的类型为java.util.Date
,请将其转换为适当的字符串并将其添加到模型中,例如
SimpleDateFormat dateFormat = new SimpleDateFormat("MM/dd/yyyy");
String stringReportPeriodDate = dateFormat.format(reportPeriodDate)
如果甚至在控制器中是一个字符串,那么首先转换为Date而不是格式化为适当的格式,例如
DateFormat formatter = new SimpleDateFormat("EEE MMM dd HH:mm:ss z yyyy");
Date reportPeriodDate =formatter.parse("Thu Jul 31 00:00:00 EDT 2014")
或者如您在评论中所说,只需在自定义编辑器中添加if分支,例如
if(text.length() >10){
DateFormat formatter = new SimpleDateFormat("EEE MMM dd HH:mm:ss z yyyy");
Date date=formatter.parse(text);
setValue(date);
return;
}
答案 1 :(得分:0)
使用隐藏输入字段时要小心,因为用户始终可以更改值
在POJO中的日期字段中使用@DateTimeFormat
注释,并使用Spring的表单标记:
public class Foo {
@DateTimeFormat( ... )
private Date reportPeriodDate;
...
}
<form:hidden path="..." />
使用ISO 8601日期/时间格式进行传输和存储(如果使用次数,则使用UTC时区进行存储)
如果可以
调试时看到的长日期时间字符串可能是在Date对象上调用toString()的结果,可能不是客户端发送到服务器的值