第(1)种:
使用@DateTimeFormat(pattern = “yyyy-MM-dd HH:mm:ss”)注解在实体字段上。
这种方式的优点是:可以灵活的定义接收的类型
缺点很明显:不能全局统一处理,需要为每个需要转换字段都加注解太麻烦
第(2)种:
写一个BaseController,每一个需要处理的controller继承这个BaseController,在BaseController里使用@InitBinder写一个全局转换日期方法:
@InitBinder public void initBinder(ServletRequestDataBinder binder) { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); binder.registerCustomEditor(Date.class, new CustomDateEditor(sdf, true)); }
这种方式的优点是:可以全局统一处理,不用再关注具体需要转换的日期字段
缺点就是:只能定义一种日期类型,我定义了”yyyy-MM-dd”就没法定义”yyyy-MM-dd HH:mm:ss”,
如果我前台不同页面过来的日期格式不一样就不好办了.
第(3)种:
放大招了):自定义DateConverterConfig实现一下spring提供的Converter,重写里面的convert方法:
import org.springframework.core.convert.converter.Converter; import org.springframework.stereotype.Component; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; /** * @author MLQ * @Description: 全局handler前日期统一处理 * @date 2020年1月6日14:25:03 */ @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; } }
我这里是springboot项目通过@Component注解将这个类交给spring容器托管的,如果springmvc项目还需要到xml配置文件注册这个类
优点很明显了:足够灵活,在静态代码块里自定义任意格式日期,在重写的方法里在配上对应的正则表达式就行,也可以做到全局统一处理,兼顾了第1种和第二种