是否有可能在Spring MVC控制器来处理不同的日期格式?
我知道,设定这样的事情
@InitBinder
protected void initBinder(WebDataBinder binder) {
SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
binder.registerCustomEditor(Date.class, new CustomDateEditor(
dateFormat, false));
}
我可以处理dd/MM/yyyy
格式,但如果我要分析什么也日期在yyyyMMddhhmmss
格式? 我要补充的多CustomDateEditor
在我的控制?
如果在同一时间收到日期只有一种格式,那么你可以简单地创建的一个实例DateFormat
基于格式
例如
决定根据输入的格式
DateFormat df = null;
if(recievedDate.indexOf("//")!=-1){
df = new SimpleDateFormat("dd/MM/yyyy")
}else{
df = new SimpleDateFormat("yyyyMMddhhmmss")
}
如果你只在puntual情况下需要它,你可以注册附着在形成场的自定义编辑器:
DateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy", this.getLocale(context));
DateFormat dateTimeFormat = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss SSS", this.getLocale(context));
binder.registerCustomEditor(Date.class, new CustomDateEditor(dateTimeFormat, true));
binder.registerCustomEditor(Date.class, "name.of.input", new CustomDateEditor(dateTimeFormat, true));
通过Skipy启发
public class LenientDateParser extends PropertyEditorSupport {
private static final List<String> formats = new ArrayList<String>();
private String outputFormat;
static{
formats.add("dd-MM-yyyy HH:ss");
formats.add("dd/MM/yyyy HH:ss");
formats.add("dd-MM-yyyy");
formats.add("dd/MM/yyyy");
formats.add("dd MMM yyyy");
formats.add("MMM-yyyy HH:ss");
formats.add("MMM-yyyy");
formats.add("MMM yyyy");
}
public LenientDateParser(String outputFormat){
this.outputFormat = outputFormat;
}
@Override
public void setAsText(String text) throws IllegalArgumentException {
if(StringUtils.isEmpty(text))
return;
DateTime dt = null;
for(String format : formats){
try{
dt = DateTime.parse(text, DateTimeFormat.forPattern(format));
break;
}catch(Exception e){
if(log.isDebugEnabled())
log.debug(e,e);
}
}
if(dt != null)
setValue(dt.toDate());
}
@Override
public String getAsText() {
Date date = (Date) getValue();
if(date == null)
return "";
DateTimeFormatter f = DateTimeFormat.forPattern(outputFormat);
return f.print(date.getTime());
}
}
这个怎么样。 上面可以很快走出失衡。
public class MostLenientDateParser {
private final List<String> supportedFormats;
public MostLenientDateParser(List<String> supportedFormats) {
this.supportedFormats = supportedFormats;
}
public Date parse(String dateValue) {
for(String candidateFormat: supportedFormats) {
Date date = lenientParse(dateValue, candidateFormat);
if (date != null) {
return date;
}
}
throw new RuntimeException("tried so many formats, non matched");
}
private Date lenientParse(String dateCandidate, String dateFormat) {
try {
return new SimpleDateFormat(dateFormat).parse(dateCandidate);
} catch (Exception e) {
return null;
}
}
}
这也可以通过弹簧转换器通过表单数据绑定和CustomDateEditor实现引用。
对于有同样的问题别人,如果你使用的春天3你可以使用你的模型领域的真棒@DateTimeFormat(模式=“DD-MM-YYYY”)。
只要确保你的org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter注册一个conversionService
你可以有,只要你想在同一个bean @DateTimeFormat之多。
不是一个伟大的想法,与多个地区打交道时,有宽大日期格式化。 像2013年10月11日一个日期将得到既DD / MM / YYYY和MM / DD / YYYY正确解析