LocalDateTime多种格式同一转换处理
场景:在程序中有可能会接收到不同的String类型的时间,需要统一转换为LocalDataTime格式
思路:先使用正则表达式,将除数字以外的符号统一替换为相同符号,之后按照符号进行分割,分割之后,按照年、月、日 三个一组划分为一个LocalDataTime时间
private static final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd");
@Test
public void testTimeFormat() {
//模拟需要处理的多种格式
List<String> timeFormatList = Arrays.asList(
"2020-01-15-122020-01-17",
"2020/1/3",
"2020-01-09/2020-01-11",
"2020年1月24日",
"2020年1月24日-2020年1月27日",
"2020.1.24",
"2020.1.24-2020.1.26"
);
try {
for (String s : timeFormatList) {
List<LocalDateTime> list = timeTransform(s);
for (LocalDateTime dateTime : list) {
System.out.println(dateTime);
}
System.out.println("=====");
}
} catch (DateTimeParseException e) {
System.out.println("时间转换错误" + e);
}
}
//传入String类型时间数据,根据具体业务需求输出两个LocalDateTime,存放在List集合中
public static List<LocalDateTime> timeTransform(Object s) {
List<LocalDateTime> list = new ArrayList<>();
if (s instanceof LocalDateTime) {
list.add((LocalDateTime) s);
list.add((LocalDateTime) s);
return list;
}
//使用正则表达式,将非数字所有符号替换为"-",并替换掉可能出现"--"的情况
String time = ((String) s).trim().replaceAll("\\D", "-").replace("--", "-");
String[] split = time.split("-");
//分割之后,按照年、月、日 三个一组划分为一个LocalDataTime时间
for (int i = 0; i < (split.length - 1) / 2; i++) {
String yyyy = split[i * 3];
String MM = split[1 + (i * 3)].length() == 2 ? split[1 + (i * 3)] : "0" + split[1 + (i * 3)];
String dd = split[2 + (i * 3)].length() == 2 ? split[2 + (i * 3)] : "0" + split[2 + (i * 3)];
LocalDateTime dateTime = LocalDate.parse(yyyy + MM + dd, formatter).atStartOfDay();
list.add(dateTime);
}
if (list.size() == 1) {
list.add(list.get(0));
}
return list;
}
}