zoukankan      html  css  js  c++  java
  • java设计模式之责任链

    工作中遇到这样一个问题,需要读取Excel里面的数据,存入数据库。

    由于Excel是个人填的,所以日期格式有多种多样,如何才能尽可能的识别用户填写的五花八门的日期,最终格式化成自己想要的形式?

    这种需求,我想到了责任链模式

    总有一种能够命中,如果实在不行,那就只能认为格式错误了。

    @Component
    public class DateFormatChain {
        private static final List<DateTimeFormatter> formatList= Lists.newArrayList();
    
        @PostConstruct
        public static void init() {
            formatList.add(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
            formatList.add(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm"));
            formatList.add(DateTimeFormatter.ofPattern("yyyy-MM-dd HH"));
            formatList.add(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
            formatList.add(DateTimeFormatter.ofPattern("yyyy年MM月dd日"));
            formatList.add(DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss"));
            formatList.add(DateTimeFormatter.ofPattern("yyyy/MM/dd"));
            formatList.add(DateTimeFormatter.ofPattern("yyyy/MM"));
            formatList.add(DateTimeFormatter.ofPattern("yyyyMMdd"));
            formatList.add(DateTimeFormatter.ofPattern("yyyy-MM"));
            formatList.add(DateTimeFormatter.ofPattern("yyyyMM"));
            formatList.add(DateTimeFormatter.ofPattern("yyyy"));
            formatList.add(new DateTimeFormatterBuilder()
                    .appendPattern("yyyy-MM")
                    .parseDefaulting(ChronoField.DAY_OF_MONTH, 1)
                    .toFormatter());
            formatList.add(new DateTimeFormatterBuilder()
                    .appendPattern("yyyyMM")
                    .parseDefaulting(ChronoField.DAY_OF_MONTH, 1)
                    .toFormatter());
            formatList.add(new DateTimeFormatterBuilder()
                    .appendPattern("yyyy/MM")
                    .parseDefaulting(ChronoField.DAY_OF_MONTH, 1)
                    .toFormatter());
            formatList.add(new DateTimeFormatterBuilder()
                    .appendPattern("yyyy")
                    .parseDefaulting(ChronoField.MONTH_OF_YEAR, 1)
                    .parseDefaulting(ChronoField.DAY_OF_MONTH, 1)
                    .toFormatter());
        }
    
    
    
        /**
         * 责任链模式:将字符串解析后转换成目标格式
         * @param s
         * @param targetFormat
         * @return
         */
        private static String parseChain(String s,DateTimeFormatter targetFormat) {
            for (DateTimeFormatter format : formatList) {
                try {
                    TemporalAccessor parse = format.parse(s);
                    return targetFormat.format(parse);
                } catch (Exception e) {
                    System.out.println(format);
                }
            }
            return null;
        }
    
        public static void main(String[] args) {
            final DateTimeFormatter dtf2=DateTimeFormatter.ofPattern("yyyy-MM");
            init();
            String s="2020-01-01 11:12";
            String s1 = parseChain(s, dtf2);
            System.out.println(s1);
        }
    
    }
  • 相关阅读:
    推荐系统入门笔记2--信息检索 Lucene
    Mybatis多个参数,其中有hashMap的写法
    Java中fastjson的toJSONString结果为空{}
    Linux中less命令出现ESC乱码
    关于博客
    【Uni-App】关于获取手机系统信息的项目实践
    mysql 服务列表找不到
    服务网格与Istio
    ARM架构服务器如何运行EasyNVR软件提示无法识别二进制文件排查及解决
    关于EasyNVR拉流摄像头的视频流存在视频流锁定机制的问题说明
  • 原文地址:https://www.cnblogs.com/wangbin2188/p/15152833.html
Copyright © 2011-2022 走看看