1. 程式人生 > 其它 >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); } }