java localdate日期格式處理

sayWhat_sayHello發表於2018-06-30

引言

作為一種業務場景,我們經常會從前端取到日期資料,針對前端回傳的資料再到資料庫進行取值。那麼針對前端傳回來的日期資料可能有幾種情況,我們也要做對應的處理。

日期的表現形式有很多種,在java裡我們可以把類似於20180630 這一種看成是一種int的,也可以看成是string型別的,具體則要看我們的業務需求,如果是資料傳過來不用進行例如日期變化之類的處理我建議存int 型別。如果是要對日期進行處理的我建議還是存string 型別。

除了上面說的20180630 型別,我們實際上還會碰到類似於201806 這種型別。這種只有年月因為它對日是沒有要求的所以我有兩種思路:1.對其進行拼接組裝成類似於20180601 這樣的格式再進行處理。2.建立新的實體類DateEntity,包含3個欄位分別代表年月日,通過getter/setter方法對欄位賦值。

除了上面說的型別實際上還可能會有2018-06-30 或者是2018/06/30 這些常見的格式。從前端傳來這些格式一定是string 型別進行處理。

還有一種是時間戳格式long 型別。

本文不使用棄用的Date 相關日期類進行處理,而是使用java8的LocalDate 對時間進行處理。所以針對大部分的傳參都會轉換成LocalDate 相關的類庫進行處理。

年月日/年月處理

這裡先解決傳入年月日和年月兩種格式的處理問題。假設傳的是int型別。
方案一:

    /**
     * date : 20180105
     */
    public static LocalDate convertWithDay(int date){
        return LocalDate.parse(String.valueOf(date),DateTimeFormatter.BASIC_ISO_DATE);
    }

    /**
     * date : 201801
     */
    public static LocalDate convertWithoutDay(int date){
        return LocalDate.parse(new StringBuilder().append(String.valueOf(date)).append("01").toString(),DateTimeFormatter.BASIC_ISO_DATE);
    }

方案二:

    public class DateEntity {
        private int year;
        private int month;
        private int day;
        //省略getter/setter方法;  
    }
    /**
     * date : 20180105
     */
    public static DateEntity convertWithDay(int date){
        DateEntity dateEntity = new DateEntity();
        int year = date/10000; // 2018
        int month = (date - year*10000)/100; // 01
        int day = date - year*10000 - month*100;
        dateEntity.setYear(year);
        dateEntity.setMonth(month);
        dateEntity.setDay(day);
        return dateEntity;
    }

    /**
     * date : 201801
     */
    public static DateEntity convertWithoutDay(int date){
        DateEntity dateEntity = new DateEntity();
        int year = date/100; // 2018
        int month = date - year*100; // 01
        dateEntity.setYear(year);
        dateEntity.setMonth(month);
        return dateEntity;
    }

對於方案1的缺點在於引入的這個01不太合理,目的只是為了湊成那種格式。但是優點也顯而易見,程式碼簡單,而且返回的LocalDate 非常便於二次運算。

對於方案2的優點在於它比較合理,如果沒有傳日就不設定日的欄位這種處理比較推薦。但是缺點就是太麻煩了(上面的優點就是它的缺點)。

相關文章