package com.corp.api.common.utils;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.regex.Pattern;
import java.util.stream.Stream;
public class DateFormatUtils {
private static class DatePatternTuple {
private final Pattern pattern;
private final String datePattern;
DatePatternTuple(final String pattern, final String datePattern) {
this.pattern = Pattern.compile(pattern);
this.datePattern = datePattern;
}
boolean matches(String candidate) {
return pattern.matcher(candidate).matches();
}
SimpleDateFormat dateFormat() {
return new SimpleDateFormat(datePattern);
}
}
private static final DatePatternTuple[] DATE_PATTERN_TUPLES = {
new DatePatternTuple("\\d{4}/\\d{1,2}/\\d{1,2} \\d{2}:\\d{2}:\\d{2}", "yyyy/MM/dd HH:mm:ss"),
new DatePatternTuple("\\d{4}/\\d{1,2}/\\d{1,2}", "yyyy/MM/dd"),
new DatePatternTuple("\\d{4}-\\d{1,2}-\\d{1,2} \\d{2}:\\d{2}:\\d{2}", "yyyy-MM-dd HH:mm:ss"),
new DatePatternTuple("\\d{4}-\\d{1,2}-\\d{1,2}", "yyyy-MM-dd"),
new DatePatternTuple("\\d{4}年\\d{1,2}月\\d{1,2}日\\d{2}时\\d{2}分\\d{2}秒", "yyyy年MM月dd日HH时mm分ss秒"),
new DatePatternTuple("\\d{1,2}/\\d{1,2}/\\d{4} \\d{2}:\\d{2}:\\d{2}", "dd/MM/yyyy HH:mm:ss"),
new DatePatternTuple("\\w{3,4} \\d{2} \\d{2}:\\d{2}:\\d{2} \\d{4}", " MMM dd HH:mm:ss yyyy")
};
public static Date freeFormatDateParser(String dateStr) {
return Stream.of(DATE_PATTERN_TUPLES)
.filter(t -> t.matches(dateStr))
.map(DatePatternTuple::dateFormat)
.filter(t -> matches(t, dateStr))
.map(t -> parse(t, dateStr))
.findFirst()
.orElse(null);
}
private static boolean matches(SimpleDateFormat dateFormat, String dateStr) {
try {
dateFormat.parse(dateStr);
return true;
} catch (ParseException e) {
return false;
}
}
private static Date parse(SimpleDateFormat dateFormat, String dateStr) {
try {
return dateFormat.parse(dateStr);
} catch (ParseException e) {
throw new RuntimeException(e);
}
}
}
DateFormatUtils.freeFormatDateParser(detailInfo.getRealValue())//转为标准Date 格式