背景
先介绍一下背景:
做了几个接口接受数据,同时每个接口都会有日期字段。我发现每个接口的日期格式都略微有些不同。所以需要对不同的接口日期进行转换。
可行性
开篇明义的说一下可以使用的方法:
- 首先是最基础的。可以将dateStr拿到String类型。然后转换成Date类型。
- 其次使用@DateTimeFormat(pattern = “yyyy-MM-dd HH:mm:ss”)注解在实体字段上。这种方式的优点是:可以灵活的定义接收的类型;缺点很明显:不能全局统一处理,需要为每个需要转换字段都加注解太麻烦。提示:@DateTimeFormat注解还有别的参数。有一些通用的格式以供快速使用。
- 在controller中写一个binder(我自己叫绑定器)在binder方法上加上@InitBinder注解就可以将传入这个controller的参数转换。这个不止能够转换日期格式,其实基本上什么都能转一下。
/**
* 绑定一个日期转换, 将UTC字符串转为date类型
* @param binder
*/
@InitBinder
public void initBinder(WebDataBinder binder){
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
simpleDateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
binder.registerCustomEditor(Date.class, new CustomDateEditor(simpleDateFormat, false));
}
- 自定义DateConverterConfig重写convert方法。实现一下spring提供的Converter,重写里面的convert方法:
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import org.springframework.core.convert.converter.Converter;
import org.springframework.stereotype.Component;
/**
* 全局handler前日期统一处理
* @author wanghh
* @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;
}
}