• 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);
        }
    
    }
  • 相关阅读:
    lintcode 最长上升连续子序列 II(二维最长上升连续序列)
    lintcode 滑动窗口的最大值(双端队列)
    windows下实现Git在局域网使用
    eclipse导入web项目之后项目中出现小红叉解决办法
    HTTP协议基础
    c++面试常用知识(sizeof计算类的大小,虚拟继承,重载,隐藏,覆盖)
    Codeforces Round #327 (Div. 2) B. Rebranding C. Median Smoothing
    c语言表白程序代码
    矩阵的逆矩阵,伴随矩阵
    document.getElementById()与 $()区别
  • 原文地址:https://www.cnblogs.com/wangbin2188/p/15152833.html
Copyright © 2020-2023  润新知