後端對前臺傳遞的日期類型處理的兩種方式

你們平時可能接觸到前臺傳到後臺的日期類型,那麼你們是如何處理的呢?我先說說我以前是怎麼處理的吧!前端

一、@JsonFormat註解

我以前一直使用這種方式來接收前臺傳進來的日期類型,當初感受挺好用的,一直用一直爽,直到有一天,前端傳進來的日期類型變了,原本的格式是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來行,看起來瞬間舒暢多了,雖然花了一早上,可是仍是挺值得的,因此你們寫代碼的過程當中,能重構的代碼最好仍是重構一下吧!!!

相關文章
相關標籤/搜索