java处理excel导入文件日期格式

该代码实现了一个Java工具类,用于解析Excel文件中常见的日期格式,包括英文locale、年-月-日、年/月/日以及带有时间的格式。通过正则表达式匹配日期字符串,并使用DateTimeFormatter或SimpleDateFormat进行转换。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题描述

excel导入文件的单元格日期格式各式各样,编写工具类对尽量多的日期格式进行解析。

代码

@AllArgsConstructor
@Getter
public enum DateTypeEnum {

    LOCALE_ENGLISH("EEE MMM dd HH:mm:ss zzz yyyy"),
    EXCEL_DATE("y-M-d"),
    EXCEL_DATE2("y/M/d"),
    EXCEL_DATETIME("y-M-d H:m:s"),
    EXCEL_DATETIME2("y/M/d H:m:s");

    /**
     * 日期格式
     */
    private final String type;
}
public class DateConvertUtil {

    private static final String REGEX_DATE = "^\\d{2,4}-\\d{1,2}-\\d{1,2}$";

    private static final String REGEX_DATE2 = "^\\d{2,4}/\\d{1,2}/\\d{1,2}$";

    private static final String REGEX_DATETIME = "^\\d{2,4}-\\d{1,2}-\\d{1,2}\\s\\d{1,2}:\\d{1,2}:\\d{1,2}$";

    private static final String REGEX_DATETIME2 = "^\\d{2,4}/\\d{1,2}/\\d{1,2}\\s\\d{1,2}:\\d{1,2}:\\d{1,2}$";

    private static final String REGEX_LOCALE_ENGLISH = "^[a-zA-Z]{3}\\s[a-zA-Z]{3}\\s\\d{2}\\s\\d{2}:\\d{2}:\\d{2}\\s[A-Z]{3}\\s\\d{4}$";

    public static LocalDate parseLocalDate(String date) {
        if (StringUtils.isBlank(date)) {
            return null;
        } else if (date.matches(REGEX_DATE)) {
            return LocalDate.parse(date, DateTimeFormatter.ofPattern(DateTypeEnum.EXCEL_DATE.getType()));
        } else if (date.matches(REGEX_DATE2)) {
            return LocalDate.parse(date, DateTimeFormatter.ofPattern(DateTypeEnum.EXCEL_DATE2.getType()));
        } else if (date.matches(REGEX_DATETIME)) {
            return LocalDate.parse(date, DateTimeFormatter.ofPattern(DateTypeEnum.EXCEL_DATETIME.getType()));
        } else if (date.matches(REGEX_DATETIME2)) {
            return LocalDate.parse(date, DateTimeFormatter.ofPattern(DateTypeEnum.EXCEL_DATETIME2.getType()));
        } else if (date.matches(REGEX_LOCALE_ENGLISH)) {
            return LocalDate.parse(date, DateTimeFormatter.ofPattern(DateTypeEnum.LOCALE_ENGLISH.getType(), Locale.ENGLISH));
        } else {
            throw new DateConvertException();
        }
    }

    public static LocalDateTime parseLocalDateTime(String date) {
        if (StringUtils.isBlank(date)) {
            return null;
        } else if (date.matches(REGEX_DATE)) {
            return LocalDateTime.parse(date, DateTimeFormatter.ofPattern(DateTypeEnum.EXCEL_DATE.getType()));
        } else if (date.matches(REGEX_DATE2)) {
            return LocalDateTime.parse(date, DateTimeFormatter.ofPattern(DateTypeEnum.EXCEL_DATE2.getType()));
        } else if (date.matches(REGEX_DATETIME)) {
            return LocalDateTime.parse(date, DateTimeFormatter.ofPattern(DateTypeEnum.EXCEL_DATETIME.getType()));
        } else if (date.matches(REGEX_DATETIME2)) {
            return LocalDateTime.parse(date, DateTimeFormatter.ofPattern(DateTypeEnum.EXCEL_DATETIME2.getType()));
        } else if (date.matches(REGEX_LOCALE_ENGLISH)) {
            return LocalDateTime.parse(date, DateTimeFormatter.ofPattern(DateTypeEnum.LOCALE_ENGLISH.getType(), Locale.ENGLISH));
        } else {
            throw new DateConvertException();
        }
    }

    public static Date parseDate(String date) throws ParseException {
        if (StringUtils.isBlank(date)) {
            return null;
        } else if (date.matches(REGEX_DATE)) {
            return new SimpleDateFormat(DateTypeEnum.EXCEL_DATE.getType()).parse(date);
        } else if (date.matches(REGEX_DATE2)) {
            return new SimpleDateFormat(DateTypeEnum.EXCEL_DATE2.getType()).parse(date);
        } else if (date.matches(REGEX_DATETIME)) {
            return new SimpleDateFormat(DateTypeEnum.EXCEL_DATETIME.getType()).parse(date);
        } else if (date.matches(REGEX_DATETIME2)) {
            return new SimpleDateFormat(DateTypeEnum.EXCEL_DATETIME2.getType()).parse(date);
        } else if (date.matches(REGEX_LOCALE_ENGLISH)) {
            return new SimpleDateFormat(DateTypeEnum.LOCALE_ENGLISH.getType(), Locale.ENGLISH).parse(date);
        } else {
            throw new DateConvertException();
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值