From 45289d5666c851f2db1777019060bb17a44eadfc Mon Sep 17 00:00:00 2001 From: chenshaohua <635616957@qq.com> Date: Wed, 29 Jul 2026 12:12:19 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A4=84=E7=90=86=E5=B7=A5=E4=BD=9C=E7=BB=8F?= =?UTF-8?q?=E5=8E=86=E6=97=A5=E6=9C=9F=E8=BD=AC=E6=8D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cms/util/remommend/JobRecommendUtil.java | 65 ++++++++++++++++++- 1 file changed, 63 insertions(+), 2 deletions(-) diff --git a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/util/remommend/JobRecommendUtil.java b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/util/remommend/JobRecommendUtil.java index 60916a7..58f699c 100644 --- a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/util/remommend/JobRecommendUtil.java +++ b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/util/remommend/JobRecommendUtil.java @@ -37,6 +37,22 @@ public class JobRecommendUtil { public static final Float EXP_MATCH_LOW1 = 2F; public static final Float EXP_MATCH_LOWER = 1F; + private static final Map CHINA_NUM_MAP; + + static { + CHINA_NUM_MAP = new HashMap<>(); + CHINA_NUM_MAP.put('零', '0'); + CHINA_NUM_MAP.put('一', '1'); + CHINA_NUM_MAP.put('二', '2'); + CHINA_NUM_MAP.put('三', '3'); + CHINA_NUM_MAP.put('四', '4'); + CHINA_NUM_MAP.put('五', '5'); + CHINA_NUM_MAP.put('六', '6'); + CHINA_NUM_MAP.put('七', '7'); + CHINA_NUM_MAP.put('八', '8'); + CHINA_NUM_MAP.put('九', '9'); + } + // =====================基础计算方法===================== /** @@ -48,17 +64,62 @@ public class JobRecommendUtil { if (StrUtil.isBlank(startDateStr)) { return 0; } - LocalDate start = LocalDate.parse(startDateStr + "-01"); + LocalDate start = parseToFirstDayOfMonth(startDateStr); LocalDate end; if (StrUtil.isBlank(endDateStr)) { end = LocalDate.now(); } else { - end = LocalDate.parse(endDateStr + "-01"); + end = parseToFirstDayOfMonth(endDateStr); } Period period = Period.between(start, end); return period.getYears() * 12 + period.getMonths(); } + /** + * 兼容两种格式:yyyy-MM / yyyy-MM-dd,返回当月1号 + */ + private static LocalDate parseToFirstDayOfMonth(String dateStr) { + try { + String source = dateStr.trim(); + //中文年份转阿拉伯数字:二零一六 → 2016 + source = convertChinaYearToNum(source); + + LocalDate date; + if (source.matches("^\\d{4}$")) { + // 仅年份 2016 → 2016-01-01 + date = LocalDate.parse(source + "-01-01"); + } else if (source.matches("^\\d{4}-\\d{2}$")) { + // yyyy-MM + date = LocalDate.parse(source + "-01"); + } else if (source.matches("^\\d{4}-\\d{2}-\\d{2}$")) { + // yyyy-MM-dd + date = LocalDate.parse(source); + } else { + throw new IllegalArgumentException("无法识别日期格式:" + dateStr); + } + return date.withDayOfMonth(1); + } catch (Exception e) { + throw new IllegalArgumentException("日期解析失败,原始值:" + dateStr + + ",支持格式:2016、2016-09、2016-09-09、二零一六", e); + } + } + + /** + * 中文年份字符串转数字年份 + * 例:二零一六 → 2016;二零二五-03 保留后面横杠 + */ + private static String convertChinaYearToNum(String str) { + StringBuilder sb = new StringBuilder(); + for (char c : str.toCharArray()) { + if (CHINA_NUM_MAP.containsKey(c)) { + sb.append(CHINA_NUM_MAP.get(c)); + } else { + sb.append(c); + } + } + return sb.toString(); + } + /** * 计算全部工作经历总月数(简单累加,不处理时间重叠) */