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