見出しの通りの機能を持つクラスです。必要に応じてYMDのパターンと正規表現を追加していけばいい感じに使えると思います。isOnCalendarメソッドを呼び出せば判定できます。
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Optional;
public class DateValidator {
private DateValidator() {
throw new IllegalStateException("Cannot instantiate " + DateValidator.class.getName());
}
public static boolean isOnCalendar(String date) {
if (date == null) {
return false;
}
Optional<RegexYmdPatternPair> ryppCorrespondingToDate = Arrays.stream(RegexYmdPatternPair.values())
.filter(p -> date.matches(p.regex)).findFirst();
if (ryppCorrespondingToDate.isEmpty()) {
return false;
}
try {
createStrictSimpleDateFormat(ryppCorrespondingToDate.get().ymdPattern).parse(date);
} catch (ParseException e) {
return false;
}
return true;
}
private static SimpleDateFormat createStrictSimpleDateFormat(String ymdPattern) {
SimpleDateFormat sdf = new SimpleDateFormat(ymdPattern);
sdf.setLenient(false);
return sdf;
}
private enum RegexYmdPatternPair {
WITHOUT_SEPARATOR("^[0-9]{8}$", "yyyyMMdd"),
SEPARATED_BY_HYPHEN("^[0-9]{4}-[0-9]{2}-[0-9]{2}$", "yyyy-MM-dd"),
SEPARATED_BY_SLASH("^[0-9]{4}/[0-9]{2}/[0-9]{2}$", "yyyy/MM/dd");
private final String regex;
private final String ymdPattern;
private RegexYmdPatternPair(String regex, String ymdPattern) {
this.regex = regex;
this.ymdPattern = ymdPattern;
}
}
}