你們平時可能接觸到前臺傳到後臺的日期類型,那麼你們是如何處理的呢?我先說說我以前是怎麼處理的吧!前端
我以前一直使用這種方式來接收前臺傳進來的日期類型,當初感受挺好用的,一直用一直爽,直到有一天,前端傳進來的日期類型變了,原本的格式是yyyy-MM-dd HH:mm:ss,忽然有個數據成了yyyy-MM-dd, 就致使後臺報錯,類型轉換異常。java
代碼以下:spring
public class User {
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date birthday;
}
複製代碼
錯誤信息:bash
org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult: 1 errors
Field error in object 'user' on field 'birthday': rejected value [2019-05-27]; codes [typeMismatch.user.birthday,typeMismatch.birthday,typeMismatch.java.util.Date,typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [user.birthday,birthday]; arguments []; default message [birthday]]; default message [Failed to convert property value of type 'java.lang.String' to required type 'java.util.Date' for property 'birthday'; nested exception is org.springframework.core.convert.ConversionFailedException: Failed to convert from type [java.lang.String] to type [@org.springframework.format.annotation.DateTimeFormat java.util.Date] for value '2019-05-27'; nested exception is java.lang.IllegalArgumentException: Parse attempt failed for value [2019-05-27]]
複製代碼
而後前端就會釘釘滴滴你,服務器內部錯誤,而後你看了半天,沒問題啊,最後實在沒辦法,是否是你日期格式傳的有問題啊,把你傳的參數發過來,最後一看果然是這出了問題。這個時候你可能跟我同樣把接收的格式改一下,可是萬一前端他傳進來的日期格式又變了你該怎麼辦呢?服務器
因此再給你們說第二種處理方式!ide
這個也是我在經歷了跟前端各類鬥智鬥勇以後,學習到的一個方法,比起上面註解的方式,這種方式擴展性更強,並且能夠同時處理多種數據格式。學習
咱們先來看一下,若是定義這個轉換器ui
@Component
public class DateConverter implements Converter<String, Date> {
private static final String dateFormat = "yyyy-MM-dd HH:mm:ss";
private static final String shortDateFormat = "yyyy-MM-dd";
private static final String timeStampFormat = "^\\d+$";
private static final String hDateFormat = "yyyy年MM月dd日 HH:mm:ss";
private static final String hshortDateFormat = "yyyy年MM月dd日";
@Override
public Date convert(String value) {
if (StringUtils.isEmpty(value)) {
return null;
}
value = value.trim();
try {
if (value.contains("-")) {
SimpleDateFormat formatter;
if (value.contains(":")) {
formatter = new SimpleDateFormat(dateFormat);
} else {
formatter = new SimpleDateFormat(shortDateFormat);
}
return formatter.parse(value);
} else if (value.matches(timeStampFormat)) {
Long lDate = new Long(value);
return new Date(lDate);
} else if (value.contains("年")) {
SimpleDateFormat formatter;
if (value.contains(":")) {
formatter = new SimpleDateFormat(hDateFormat);
} else {
formatter = new SimpleDateFormat(hshortDateFormat);
}
return formatter.parse(value);
}
} catch (Exception e) {
throw new RuntimeException(String.format("parser %s to Date fail", value));
}
throw new RuntimeException(String.format("parser %s to Date fail", value));
}
}
複製代碼
上面的年月日格式是我最近的項目中是這種格式,因此是我擴展新加的,因此經過轉化器的這種方式,請求進來進來以後,若是參數中有日期格式,那麼首先會進入轉換器中進行解析,經過上面的代碼你們很容易看出,經過傳進來的格式判斷日期是哪一種格式,而後再進行解析,最後返回一個Date類型,進入咱們的業務代碼處理業務。spa
可是若是你傳進來的日期格式不符合規範或者說沒有定義格式,那麼在轉換的過程當中,仍是會報錯。因此咱們通常最好跟前端規定好某種格式,要麼贊成yyyy-MM-dd的格式,要麼yyyy年MM月dd日,不要一個接口一個格式,這樣處理起來也是很費勁的。code
上週寫一個接口,業務代碼也不是很複雜,可是代碼的量仍是有點東西的,我是真的有點頂不住啊,因此花了一早上把這個接口重構了一下,最後主方法從70多行,減小到了10來行,看起來瞬間舒暢多了,雖然花了一早上,可是仍是挺值得的,因此你們寫代碼的過程當中,能重構的代碼最好仍是重構一下吧!!!