问题描述
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();
}
}
}