处理工作经历日期转换

This commit is contained in:
chenshaohua
2026-07-29 12:12:19 +08:00
parent 9b7fdafcd1
commit 45289d5666

View File

@@ -37,6 +37,22 @@ public class JobRecommendUtil {
public static final Float EXP_MATCH_LOW1 = 2F; public static final Float EXP_MATCH_LOW1 = 2F;
public static final Float EXP_MATCH_LOWER = 1F; public static final Float EXP_MATCH_LOWER = 1F;
private static final Map<Character, Character> 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)) { if (StrUtil.isBlank(startDateStr)) {
return 0; return 0;
} }
LocalDate start = LocalDate.parse(startDateStr + "-01"); LocalDate start = parseToFirstDayOfMonth(startDateStr);
LocalDate end; LocalDate end;
if (StrUtil.isBlank(endDateStr)) { if (StrUtil.isBlank(endDateStr)) {
end = LocalDate.now(); end = LocalDate.now();
} else { } else {
end = LocalDate.parse(endDateStr + "-01"); end = parseToFirstDayOfMonth(endDateStr);
} }
Period period = Period.between(start, end); Period period = Period.between(start, end);
return period.getYears() * 12 + period.getMonths(); 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();
}
/** /**
* 计算全部工作经历总月数(简单累加,不处理时间重叠) * 计算全部工作经历总月数(简单累加,不处理时间重叠)
*/ */