我正在尝试创建一个表单,它将发送一个带有时间戳的对象。现在,输入格式必须是yyyy-MM-dd HH:mm:ss
,我希望以dd.MM.yyyy HH:mm
格式输入时间戳 - 如何更改输入格式?
对象类:
public class Test {
private Timestamp dateStart;
public Timestamp getDateStart() {
return dateStart;
}
public void setDateStart(Timestamp dateStart) {
this.dateStart = new Timestamp(dateStart.getTime());
}
}
控制器方法:
@RequestMapping(value="test", method = RequestMethod.POST)
public View newTest(@ModelAttribute("test") Test test, Model model) {
//save the Test object
}
jsp表格:
<form:form action="service/test" method="post" modelAttribute="test">
<form:input type="text" path="dateStart" />
</form:form>
格式不正确时,我收到此错误:
Field error in object 'test' on field 'dateStart': rejected value [22.05.2012 14:00]; codes [typeMismatch.test.dateStart,typeMismatch.dateStart,typeMismatch.java.sql.Timestamp,typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [test.dateStart,dateStart]; arguments []; default message [dateStart]]; default message [Failed to convert property value of type 'java.lang.String' to required type 'java.sql.Timestamp' for property 'dateStart'; nested exception is org.springframework.core.convert.ConversionFailedException: Unable to convert value "22.05.2012 14:00" from type 'java.lang.String' to type 'java.sql.Timestamp'; nested exception is java.lang.IllegalArgumentException: Timestamp format must be yyyy-mm-dd hh:mm:ss[.fffffffff]]
答案 0 :(得分:10)
感谢Tomasz我得到了答案,我必须向控制器添加一个binder方法:
@InitBinder
public void binder(WebDataBinder binder) {binder.registerCustomEditor(Timestamp.class,
new PropertyEditorSupport() {
public void setAsText(String value) {
try {
Date parsedDate = new SimpleDateFormat("dd.MM.yyyy HH:mm").parse(value);
setValue(new Timestamp(parsedDate.getTime()));
} catch (ParseException e) {
setValue(null);
}
}
});
}
答案 1 :(得分:0)
仅供参考,这里是一个完整的Timestamp自定义编辑器的代码(它也支持getAsText()),由http://adfinmunich.blogspot.com/2011/04/how-to-write-sqltimestamppropertyeditor.html提供,只需更改DEFAULT_BATCH_PATTERN以匹配您想要的日期/时间戳模式,或者发送所需的模式你构造了SqlTimestampPropertyEditor:
package org.springframework.beans.custompropertyeditors;
import java.beans.PropertyEditorSupport;
import java.sql.Timestamp;
import java.text.ParseException;
import java.text.SimpleDateFormat;
/**
* Property editor for java.sql.Timestamp, supporting SimpleDateFormat.
*
* Using default Constructor uses the pattern yyyy-MM-dd
* Using the constructor with String, you can use your own pattern.
*
*/
public class SqlTimestampPropertyEditor extends PropertyEditorSupport {
public static final String DEFAULT_BATCH_PATTERN = "yyyy-MM-dd";
private final SimpleDateFormat sdf;
/**
* uses default pattern yyyy-MM-dd for date parsing.
*/
public SqlTimestampPropertyEditor() {
this.sdf = new SimpleDateFormat(SqlTimestampPropertyEditor.DEFAULT_BATCH_PATTERN);
}
/**
* Uses the given pattern for dateparsing, see {@link SimpleDateFormat} for allowed patterns.
*
* @param pattern
* the pattern describing the date and time format
* @see SimpleDateFormat#SimpleDateFormat(String)
*/
public SqlTimestampPropertyEditor(String pattern) {
this.sdf = new SimpleDateFormat(pattern);
}
/**
* @see java.beans.PropertyEditorSupport#setAsText(java.lang.String)
*/
@Override
public void setAsText(String text) throws IllegalArgumentException {
try {
setValue(new Timestamp(this.sdf.parse(text).getTime()));
} catch (ParseException ex) {
throw new IllegalArgumentException("Could not parse date: " + ex.getMessage(), ex);
}
}
/**
* Format the Timestamp as String, using the specified DateFormat.
*/
@Override
public String getAsText() {
Timestamp value = (Timestamp) getValue();
return (value != null ? this.sdf.format(value) : "");
}
}
要使用此类,您需要定义以下@InitBinder:
@InitBinder
public void binder(WebDataBinder binder) {binder.registerCustomEditor(Timestamp.class,
new org.springframework.beans.custompropertyeditors.SqlTimestampPropertyEditor();}
如果要使用非默认日期/时间戳模式,请在构造函数中将其提供给SqlTimestampPropertyEditor,因此对于此特定示例,您可以使用:
@InitBinder
public void binder(WebDataBinder binder) {binder.registerCustomEditor(Timestamp.class,
new org.springframework.beans.custompropertyeditors.SqlTimestampPropertyEditor("dd.MM.yyyy HH:mm");}