Spring MVC下对Request请求中日期字符串转换成Date类型的总结

背景

先介绍一下背景:
做了几个接口接受数据,同时每个接口都会有日期字段。我发现每个接口的日期格式都略微有些不同。所以需要对不同的接口日期进行转换。

可行性

开篇明义的说一下可以使用的方法:

  1. 首先是最基础的。可以将dateStr拿到String类型。然后转换成Date类型。
  2. 其次使用@DateTimeFormat(pattern = “yyyy-MM-dd HH:mm:ss”)注解在实体字段上。这种方式的优点是:可以灵活的定义接收的类型;缺点很明显:不能全局统一处理,需要为每个需要转换字段都加注解太麻烦。提示:@DateTimeFormat注解还有别的参数。有一些通用的格式以供快速使用。
  3. 在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));
    }
  1. 自定义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 {

    private static final List 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;
    }

}

参考文章:
spring Boot实践--前端字符串日期自动转换成后台date类型

你可能感兴趣的:(Spring MVC下对Request请求中日期字符串转换成Date类型的总结)