处理工作经历日期转换
This commit is contained in:
@@ -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<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)) {
|
||||
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();
|
||||
}
|
||||
|
||||
/**
|
||||
* 计算全部工作经历总月数(简单累加,不处理时间重叠)
|
||||
*/
|
||||
|
||||
Reference in New Issue
Block a user