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);
    }

}
原文地址:https://www.cnblogs.com/wangbin2188/p/15152833.html