最近在项目中需要解析甲方给的Excel文档,里面有个时间字段格式多种多样
"2023/1/1",
"2023-1-1",
"2023-1-1 0:15",
"2023-1-16 1:45",
"2023-01-01 00:15",
"2023/01/01 12:30"
用DateTimeFormatter只能识别部分格式
java
DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"),
DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss"),
DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm"),
DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm"),
后面写了个工具解析,先尝试用DateTimeFormatter解析,如果解析失败,进行规范化后再解析
下面是我的完整代码
java
package xboot;
import org.testng.annotations.Test;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeParseException;
public class TimeTest {
@Test
public void test() {
String[] testCases = {
"2023/1/1",
"2023-1-1",
"2023-1-1 0:15",
"2023-1-16 1:45",
"2023-01-01 00:15",
"2023/01/01 12:30"
};
for (String test : testCases) {
try {
System.out.println(test + " -> " + parseDateTime(test));
} catch (Exception e) {
System.out.println(test + " -> 解析失败");
}
}
}
/**
* 日期时间格式化器
*/
private static final DateTimeFormatter[] DATE_FORMATTERS = {
DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"),
DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss"),
DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm"),
DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm"),
};
private LocalDateTime parseDateTime(String dateTimeStr) {
// 先尝试直接解析
for (DateTimeFormatter formatter : DATE_FORMATTERS) {
try {
return LocalDateTime.parse(dateTimeStr, formatter);
} catch (DateTimeParseException e) {
// 继续尝试
}
}
// 如果直接解析失败,尝试规范化后再解析
String normalized = normalizeDateTimeString(dateTimeStr);
for (DateTimeFormatter formatter : DATE_FORMATTERS) {
try {
return LocalDateTime.parse(normalized, formatter);
} catch (DateTimeParseException e) {
// 继续尝试
}
}
throw new DateTimeParseException("无法解析日期时间: " + dateTimeStr, dateTimeStr, 0);
}
/**
* 规范化日期时间字符串:给月份、日期、小时补零
*/
private String normalizeDateTimeString(String str) {
String result = str.trim();
// 分离日期和时间部分
String[] parts = result.split(" ");
String datePart = parts[0];
String timePart = parts.length > 1 ? parts[1] : "";
// 处理日期部分
String separator = datePart.contains("/") ? "/" : "-";
String[] dateParts = datePart.split("[/-]");
if (dateParts.length == 3) {
String year = dateParts[0];
String month = String.format("%02d", Integer.parseInt(dateParts[1]));
String day = String.format("%02d", Integer.parseInt(dateParts[2]));
datePart = year + separator + month + separator + day;
}
// 处理时间部分
if (!timePart.isEmpty()) {
String[] timeParts = timePart.split(":");
if (timeParts.length >= 2) {
String hour = String.format("%02d", Integer.parseInt(timeParts[0]));
String minute = String.format("%02d", Integer.parseInt(timeParts[1]));
timePart = hour + ":" + minute;
if (timeParts.length == 3) {
timePart += ":" + String.format("%02d", Integer.parseInt(timeParts[2]));
}
}
} else {
timePart = "00:00";
}
return datePart + " " + timePart;
}
}