引言
作为一种业务场景,我们经常会从前端取到日期数据,针对前端回传的数据再到数据库进行取值。那么针对前端传回来的日期数据可能有几种情况,我们也要做对应的处理。
日期的表现形式有很多种,在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的优点在于它比较合理,如果没有传日就不设置日的字段这种处理比较推荐。但是缺点就是太麻烦了(上面的优点就是它的缺点)。