java时间字符串格式化工具

最近在项目中需要解析甲方给的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;
    }
}