Вызвать исключение, когда в SimpleDateFormat передается недопустимая строка в JAVA - PullRequest
1 голос
/ 07 мая 2020

У меня есть входящая строка, которая должна быть датой в формате «yyyyMMdd». (Например, сегодняшняя дата - 20200507) Но иногда входная строка может иметь недопустимый формат, и анализатор даты должен выдавать исключение (исключение синтаксического анализа), но это не за исключением того, что он возвращает объект даты.

Пример кода в случае, если строка неверна или буквенно-цифровая c как показано ниже:

class Demo {
public static void main(String args[]) throws Exception {
    String inputString = "9450524Q";
    SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMdd", Locale.ENGLISH);
    System.out.println(formatter.parse(inputString));
}}

Вывод:

Tue Apr 04 00:00:00 IST 9454

Ответы [ 2 ]

3 голосов
/ 07 мая 2020

От JavaDo c из DateFormat, от которого SimpleDateFormat напрямую наследует:

По умолчанию, синтаксический анализ является мягким: если входные данные не в форме, используемой форматом этого объекта метод, но все еще может быть проанализирован как дата, тогда синтаксический анализ будет успешным. Клиенты могут настоять на строгом соблюдении формата, позвонив по номеру setLenient(false).

1 голос
/ 07 мая 2020

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:

  1. При стандартных настройках он снисходительный , он принимает недопустимый номер месяца.
  2. Когда его просят проанализировать две цифры и найти только одну, он рассчитывается с этим ди git, не сообщая об ошибке.
  3. В случае неразборчивого текста после проанализированного текста он также не сообщает об ошибках.

Ссылки

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...