Как проверить правильность формата даты - PullRequest
0 голосов
/ 22 апреля 2019

Я не могу написать метод для проверки правильности формата даты.

Я написал метод проверки правильности формата даты, но он дает неправильные результаты, и я не могу найти ошибку.

    boolean isDateFormatCorrect(String date) {
        LocalDate ld = null;
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd", Locale.ENGLISH);
        ld = LocalDate.parse(date, formatter);
        String result = ld.format(formatter);
        return result.equals(date);
    }
    @ParameterizedTest
    @CsvSource({"2019-04-20", "2017-01-13"})
    void isDateFormatCorrect(String date) {
        assertThat(currencyService
                .isDateFormatCorrect(date))
                .isEqualTo(true);
    }
    @ParameterizedTest
    @CsvSource({"20-04-2019", "01-01-1999", "22/2/2012", "2012/2/12"})
    void isDateFormatNotCorrect(String date) {
        assertThat(currencyService
                .isDateFormatCorrect(date))
                .isEqualTo(false);
    }

Первый тест дает правильные ответы, а второй - исключение:

java.time.format.DateTimeParseException: Text '20-04-2019' could not be parsed at index 0

Я полагаю, что ответ прост, но я пытался исправить это более часа и потерял идеи.

1 Ответ

0 голосов
/ 22 апреля 2019

Используйте это.

new DateTimeFormatterBuilder()
            .appendValue(ChronoField.YEAR, 4, 4, SignStyle.NEVER)
            .appendPattern("MMdd")
            .toFormatter()
            .withResolverStyle(ResolverStyle.STRICT)

Просто чтобы сообщить, что причиной исключения является недопустимый компонент date. В противном случае это все еще в силе. Например: 04-04-04 с yyyy-MM-dd интерпретируется как 4 апреля 2004 г.

А это Javadoc для DatetimeFormatter для года анализа. Также см. ResolverStyle

Год: Количество букв определяет минимальную ширину поля, ниже которой используется заполнение. Если количество букв равно двум, то используется сокращенная двухзначная форма. Для печати выводятся две самые правые цифры. Для синтаксического анализа это будет проанализировано с использованием базового значения 2000, что приведет к году в диапазоне от 2000 до 2099 включительно. Если количество букв меньше четырех (но не двух), то знак выводится только для отрицательных лет согласно SignStyle.NORMAL. В противном случае, знак выводится, если ширина пэда превышена, согласно SignStyle.EXCEEDS_PAD.

...