zoukankan      html  css  js  c++  java
  • coding++:SpringBoot 处理前台字符串日期自动转换成后台date类型的三种办法

    第(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种和第二种

  • 相关阅读:
    《Android深入透析》之广播(Broadcast)
    曾经的程序员-《30岁的程序员,你迷惘了吗?》
    30岁的程序员,你迷惘了吗?
    Android: 详解触摸事件如何传递
    关于HTML5服务器发送事件(SSE)
    Android: 在onCreate()中获得对象尺寸
    jxl教程图文详解
    相当牛X的java版星际游戏
    程序员的无奈(十二):终于获得了投资
    图览各编程语言中敲击最多的键
  • 原文地址:https://www.cnblogs.com/codingmode/p/12156249.html
Copyright © 2011-2022 走看看