Если вы прочитали документацию, то есть javadoc из parse
, вы увидите:
Проводит текст с начала данной строки, чтобы произвести свидание. Метод может не использовать весь текст данной строки.
Подробнее см. Метод
parse(String, ParsePosition)
.Javadoc другого метода говорит:
Параметры:
source
- Строка даты / времени, подлежащая анализу
pos
- на входе - позиция, в которой начнется синтаксический анализ; на выходе, позиция, в которой завершился синтаксический анализ, или начальная позиция, если синтаксический анализ не был выполнен.Итак, чтобы весь текст соответствовал формату даты, используйте второй метод и проверьте окончание parse position
Это также имеет положительный эффект от использования исключений для потока управления .
private static boolean isDate(String val) { String trimmedVal = val.trim(); //These are the only formats dates will have String[] formatList = {"MM/dd/yyyy", "MM-dd-yyyy", "MMM/dd/yyyy", "dd-MMM-yyyy"}; SimpleDateFormat dateFormat = new SimpleDateFormat(); dateFormat.setLenient(false); ParsePosition pos = new ParsePosition(0); for (String str : formatList) { pos.setIndex(0); dateFormat.applyPattern(str); dateFormat.parse(trimmedVal, pos); if (pos.getIndex() == trimmedVal.length()) return true; // full text parsed without error } return false; }
Тест
System.out.println(isDate("12/31/2018")); System.out.println(isDate("12-31-2018")); System.out.println(isDate("Dec/31/2018")); System.out.println(isDate("31-Dec-2018")); System.out.println(isDate("4/05/2013")); System.out.println(isDate("4/05/2013 23:54"));
Выход
true true true true true false