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);
        }
    
    }
  • 相关阅读:
    每日一题-mysql(持续更新)
    http面试问题集锦
    存储测试简析
    横向越权测试—安全漏洞
    性能数据的准备-Jmeter
    获取当天七天时间
    vue生命周期
    vue的全选与反选
    filter兼容问题
    Http与Https
  • 原文地址:https://www.cnblogs.com/wangbin2188/p/15152833.html
Copyright © 2011-2022 走看看