java .time
Я рекомендую вам использовать java .time, современный Java API даты и времени, для работы с датами. Преимущества в вашем конкретном случае включают то, что нужный вам форматтер уже встроен и вызывает исключение, о котором вы просите.
Для демонстрации я использую этот вспомогательный метод:
public static void tryToParse(String dateString) {
try {
LocalDate date
= LocalDate.parse(dateString, DateTimeFormatter.BASIC_ISO_DATE);
System.out.println(dateString + " -> " + date);
} catch (DateTimeParseException dtpe) {
System.out.println(dateString + ": " + dtpe.getMessage());
}
}
Попробуйте:
// Valid date
tryToParse("20200507");
// Invalid date value
tryToParse("20210229");
// Text after date
tryToParse("20200623Q");
// Example from question
tryToParse("9450524Q");
Результат:
20200507 -> 2020-05-07
20210229: Text '20210229' could not be parsed: Invalid date 'February 29' as '2021' is not a leap year
20200623Q: Text '20200623Q' could not be parsed, unparsed text found at index 8
9450524Q: Text '9450524Q' could not be parsed at index 6
Пожалуйста, также наслаждайтесь точными и полезными сообщениями об исключениях. В последнем случае произошло следующее: год 9450 и месяц 52 были проанализированы, но, поскольку 4Q
не является допустимой датой two-di git, было сгенерировано исключение (перед проверкой того, является ли 52 действительным номером месяца).
Что произошло в вашем коде
Класс SimpleDateFormat
- известный нарушитель спокойствия. Вы обнаружили в нем главную проблему дизайна, но определенно не единственную. Вот что он сделал: он проанализировал 4-ди git год, 9450 и два-ди git месяц, 52. В году 12 месяцев, но SimpleDateFormat
со стандартными настройками все равно. Он преобразует 48 месяцев в 4 года и заканчивается 4-м месяцем через 4 года. Наконец, 4 анализируется как день месяца. Остальная часть текста, Q
, игнорируется.
Насколько я понимаю, в вашем примере показаны три fl aws из SimpleDateFormat
:
- При стандартных настройках он снисходительный , он принимает недопустимый номер месяца.
- Когда его просят проанализировать две цифры и найти только одну, он рассчитывается с этим ди git, не сообщая об ошибке.
- В случае неразборчивого текста после проанализированного текста он также не сообщает об ошибках.
Ссылки