springmvc/springboot處理前臺字串日期自動轉換成後臺date型別的三種辦法
問題還原:當前臺提交日期格式資料到後臺儲存時,已辦以字串的形式傳輸,如果後臺是data型別接受的話會報400格式錯誤。這時候就需要處理一下: 第0種(最low的方式):後臺用String型別欄位接收,如果需要使用再換成date。
第1種:使用@DateTimeFormat(pattern = “yyyy-MM-dd HH:mm:ss”)註解在實體欄位上, 這種方式的優點是:可以靈活的定義接收的型別 缺點很明顯:不能全域性統一處理,需要為每個需要轉換欄位都加註解太麻煩
第2種:寫一個BaseController,每一個需要處理的controller繼承這個BaseController,在BaseController裡使用@InitBinder寫一個全域性轉換日期方法:
@InitBinder public void initBinder(ServletRequestDataBinder binder) { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); binder.registerCustomEditor(Date.class, new CustomDateEditor(sdf, true)); } 這種方式的優點是:可以全域性統一處理,不用再關注具體需要轉換的日期欄位 缺點就是:只能定義一種日期型別,我定義了”yyyy-MM-dd”就沒法定義”yyyy-MM-dd HH:mm:ss”, 如果我前臺不同頁面過來的日期格式不一樣就不好辦了
第3種(放大招了):自定義DateConverterConfig實現一下spring提供的Converter,重寫裡面的convert方法:
/** * 全域性handler前日期統一處理 * @author zhanghang * @date 2018/1/11 */ @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 = 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; }
} 我這裡是springboot專案通過@Component註解將這個類交給spring容器託管的,如果springmvc專案還需要到xml配置檔案註冊這個類 優點很明顯了:足夠靈活,在靜態程式碼塊裡自定義任意格式日期,在重寫的方法裡在配上對應的正則表示式就行,也可以做到全域性統一處理,兼顧了第1種和第二種,完美666! 原文:https://blog.csdn.net/eumenides_/article/details/79033505