Рубрики
Без рубрики

Как проверить, действительна ли дата в Java

В этой статье показано, как использовать Java 8 DateTimeFormatter, чтобы проверить, допустим ли формат даты в Java.

В этой статье показано, как использовать Java 8 DateTimeFormatter чтобы проверить, допустим ли формат даты в Java.

Ниже приведены требования к действительной дате.

  1. Формат года, 1900, 2099
  2. Формат месяца, 1, 01, 2, 02… 12
  3. Формат дня, 1, 01…31
  4. Високосный год, 29 февраля.
  5. Обычный год, 28 дней февраля.
  6. Месяц 1, 3, 5, 7, 8, 10, 12, максимум 31 день.
  7. Месяц 4, 6, 9, 11, максимум 30 дней.
  8. ISO 8601 , 2020-11-03, гггг-ММ-дд

1. Формат даты – уууу-М-д

В Java 8 мы можем использовать Форматировщик даты и времени и Решающий стиль. СТРОГИЙ для выполнения вышеуказанных действительных требований к данным.

Для DateTimeFormatter символы y означают год нашей эры, нашей эры или нашей эры; а символ u означает год, поэтому мы выбираем u для формата года.

Для месяца и дня нам нужно поддерживать одиночный или ведущий нулевой формат (1 или 01), мы выбираем один M для месяца и одиночный д на весь день. И окончательный формат даты – уууу-М-д .

Ниже приведен валидатор даты Java 8.

package com.mkyong.regex.date;

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeParseException;
import java.time.format.ResolverStyle;

public class DateValidatorDateTimeFormatter {

    public static boolean isValid(final String date) {

        boolean valid = false;

        try {

            // ResolverStyle.STRICT for 30, 31 days checking, and also leap year.
            LocalDate.parse(date,
                    DateTimeFormatter.ofPattern("uuuu-M-d")
                            .withResolverStyle(ResolverStyle.STRICT)
            );

            valid = true;

        } catch (DateTimeParseException e) {
            e.printStackTrace();
            valid = false;
        }

        return valid;
    }
}

2. Модульные тесты Валидатора даты.

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

package com.mkyong.regex.date;

import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.MethodSource;

import java.util.stream.Stream;

import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertTrue;

public class DateValidatorTest {

    @ParameterizedTest(name = "#{index} - Run test with date = {0}")
    @MethodSource("validDateProvider")
    void test_date_java_api_valid(String date) {
        assertTrue(DateValidatorDateTimeFormatter.isValid(date));
    }

    @ParameterizedTest(name = "#{index} - Run test with date = {0}")
    @MethodSource("invalidDateProvider")
    void test_date_java_api_invalid(String date) {
        assertFalse(DateValidatorDateTimeFormatter.isValid(date));
    }

    static Stream validDateProvider() {
        return Stream.of(
                "1998-09-30",
                "1998-9-30",
                "2020-09-1",
                "2020-09-01",
                "2020-9-1",
                "2020-9-01",
                "2020-2-29",             // leap year
                "2020-2-28",             // leap year
                "2019-2-28",             // common year
                "2000-02-29",            // 2000 is a leap year, % 400 == 0
                "1900-02-28",            // 1900 is a common year
                "2020-07-31",
                "2020-08-31",
                "2020-06-30",
                "1900-01-01",
                "2099-12-31");
    }

    static Stream invalidDateProvider() {
        return Stream.of(
                "1998-09-31",               // invalid day, sep max 30
                "1998-11-31",               // invalid day, nov max 30
                "2008-02-2x",               // invalid day 2x
                "2008-0x-28",               // invalid month 0x
                "20xx-02-28",               // invalid year 20xx
                "20-11-02",                 // invalid year 20, must be yyyy
                "2020/11/02",               // invalid date format, yyyy-mm-dd
                "2020-11-32",               // invalid day, 32
                "2020-13-30",               // invalid month 13
                "2020-A-20",                // invalid month A
                "2020-2-30",                // leap year, feb max 29
                "2019-2-29",                // common year, feb max 28
                "1900-02-29",               // 1900 is a common year, feb max 28
                "12012-04-05",              // support only 4 digits years
                " ",                        // empty
                "");                        // empty
    }

}

Все прошло.

3. SimpleDateФормат – гггг-М-д

Для устаревшего приложения Java мы используем SimpleDateFormat и .setlenient(ложь) для проверки формата даты.

package com.mkyong.regex.date;

import java.text.ParseException;
import java.text.SimpleDateFormat;

public class DateValidatorSimpleDateFormat {

    private static final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-M-d");

    public static boolean isValid(final String date) {

        boolean valid = false;

        try {
            // why 2008-02-2x, 20-11-02, 12012-04-05 are valid date?
            sdf.parse(date);
            // strict mode - check 30 or 31 days, leap year
            sdf.setLenient(false);
            valid = true;

        } catch (ParseException e) {
            e.printStackTrace();
            valid = false;
        }

        return valid;
    }
}

Снова запустите те же модульные тесты #3; на этот раз мы используем DateValidator SimpleDateFormat .

Три теста провалились.

  1. 2008-02-2 раза
  2. 20-11-02
  3. 12012-04-05

Как правило, SimpleDateFormat все еще может проверять большую часть формата даты, за исключением некоторых случаев, таких как вышеупомянутые три формата даты.

Дальнейшее чтение Если вам не нравится магия API черного ящика для проверки даты, подумайте об этом Регулярное выражение Java для проверки даты

Скачать Исходный Код

$клон git $клон git

$cd java-регулярное выражение/дата

Рекомендации

Оригинал: “https://mkyong.com/java/how-to-check-if-date-is-valid-in-java/”