工作中遇到这样一个问题,需要读取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); } }