先贴出正则表达式:
static String dateReg=Pattern.compile("^(\\d{4})[\\-/.年](0?[1-9]|1[012])[\\-/.月](0?[1-9]|[12]\\d|3[01])日?|([1-9]\\d{7})");
以下是解析工具方法:
static LocalDate parseDate(String date) { Matcher m = dateReg.matcher(date); if (m.find()) { String year = m.group(1); if (StringUtils.isNotEmpty(year)) { return LocalDate.of(Integer.parseInt(year), Integer.parseInt(m.group(2)), Integer.parseInt(m.group(3))); } return LocalDate.parse(date, DateTimeFormatter.ofPattern("yyyyMMdd")); } throw new RuntimeException("仅支持日期格式:yyyy-MM-dd,yyyy/MM/dd,yyyyMMdd"); }
现解析日期字符串:
parseDate("2024-12-17 00:00:00")
结果:是2024-12-17 还是 2024-12-01?
结论:2024-12-01
原因分析:问题出在匹配“日”的正则表达式里顺序:
将"^(\\d{4})[\\-/.年](0?[1-9]|1[012])[\\-/.月](0?[1-9]|[12]\\d|3[01])日?|([1-9]\\d{7})" 的正则替换为"^(\\d{4})[\\-/.年](1[012]|0?[1-9])[\\-/.月]([12]\\d|3[01]|0?[1-9])日?|([1-9]\\d{7})"后,结果正确:2024-12-17。
“日” 的表达式为:0?[1-9]|[12]\\d|3[01],当匹配 17 时,表达式第一部分“0?[1-9]”有限匹配上,所以group(3)分组三返回了1,而不是17。
注意:此处是匹配并且分组提取值,所以必须优先顺序问题。若仅仅是匹配日期是否是指定的格式,那与顺序无关!