問題描述
當前臺提交日期字串到后臺時,以字串形式傳輸,若后臺接收時采用Date型別,則會報格式轉換錯誤的例外.
解決
方式一:
將 @DateTimeFormat(pattern = “yyyy-MM-dd HH:mm:ss”) 注解添加到物體類的欄位上.
- 優點:可以靈活定義接收的型別
- 缺點:不能實作全域統一處理,要為每個需要轉換的欄位添加注解
方式二:
定義一個 BaseController 基礎類,在類中使用 @InitBinder 注解定義一個全域的日期格式轉換的方法,在定義其它Controller時繼承 BaseController 即可.
@InitBinder
public void initBinder(ServletRequestDataBinder binder) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
binder.registerCustomEditor(Date.class, new CustomDateEditor(sdf, true));
}
- 優點:可以實作全域處理,無需關注具體需要轉換的日期欄位
- 缺點:只能定義一種日期格式
方式三(推薦):
自定義一個 DateConverterConfig 類,實作 spring 提供的 Converter,重寫里面的 convert() 方法.
/**
* 全域 日期格式 轉換器
*/
@Component
public class DateConverterConfig implements Converter<String, Date> {
// 日期格式
private static final List<String> formarts = new ArrayList<>(4);
static{
formarts.add("yyyy-MM");
formarts.add("yyyy-MM-dd");
formarts.add("yyyy-MM-dd hh:mm");
formarts.add("yyyy-MM-dd hh:mm:ss");
}
@Override
public Date convert(String source) {
String value = https://www.cnblogs.com/herokevin/p/source.trim();
if ("".equals(value)) {
return null;
}
if(source.matches("^\\d{4}-\\d{1,2}$")){
return parseDate(source, formarts.get(0));
}else if(source.matches("^\\d{4}-\\d{1,2}-\\d{1,2}$")){
return parseDate(source, formarts.get(1));
}else if(source.matches("^\\d{4}-\\d{1,2}-\\d{1,2} {1}\\d{1,2}:\\d{1,2}$")){
return parseDate(source, formarts.get(2));
}else if(source.matches("^\\d{4}-\\d{1,2}-\\d{1,2} {1}\\d{1,2}:\\d{1,2}:\\d{1,2}$")){
return parseDate(source, formarts.get(3));
}else {
throw new IllegalArgumentException("Invalid boolean value '" + source + "'");
}
}
/**
* 格式化日期
* @param dateStr String 字符型日期
* @param format String 格式
* @return Date 日期
*/
public Date parseDate(String dateStr, String format) {
Date date=null;
try {
DateFormat dateFormat = new SimpleDateFormat(format);
date = dateFormat.parse(dateStr);
} catch (Exception e) {
}
return date;
}
}
- 優點:靈活度高,可以在靜態代碼塊里定義任意的日期格式,然后配置對應的正則運算式,兼顧了前兩種方式.
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/412862.html
標籤:Java
