- How to check if the given date is valid or not in Java
- Java program to check if a given date is valid or not
- Проверьте, является ли строка Допустимой датой в Java
- 2. Обзор Проверки данных
- 3. Проверьте С помощью DateFormat
- 4. Проверьте С Помощью LocalDate
- 5. Проверка с помощью DateTimeFormatter
- 6. Проверка С Помощью Валидатора Apache Commons
- 7. Заключение
- Читайте ещё по теме:
- Java — how to check if String is valid date?
- 1. Overview
- 2. With SimpleDateFormat
- 3. With SimpleDateFormat + different patterns
- 4. LocalDate — Java 8
- 5. LocalDate + DateTimeFormatter build-in patterns
- 6. LocalDate + DateTimeFormatter different patterns
- References
How to check if the given date is valid or not in Java
Hey Everyone! In this article, we will learn how we can check if a given date is valid or not in Java.
For a given date to be valid we have to check two conditions which are as follows:-
1. It should be in the specified format i.e in dd/mm/yyyy format.
2. It should exist in the Calendar i.e 30/02/2013 doesn’t exist.
Let’s have a look at the code:-
Java program to check if a given date is valid or not
The below program will check the date is valid or invalid. The output is also given.
package datevalidation; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Scanner; public class DateValidation < public static void main(String[] args) < Scanner sc = new Scanner(System.in); System.out.println("Enter a date in dd/mm/yyyy format"); String date = sc.next(); if(dateValidation(date)==true) System.out.println("Date is valid"); else System.out.println("Date is invalid"); >private static boolean dateValidation(String date) < boolean status = false; if (checkDate(date)) < DateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy"); dateFormat.setLenient(false); try < dateFormat.parse(date); status = true; >catch (Exception e) < status = false; >> return status; > static boolean checkDate(String date) < String pattern = "(0?6|[12]3|3[01])\\/(0?4|12)\\/(4)"; boolean flag = false; if (date.matches(pattern)) < flag = true; >return flag; > >
Enter a date in dd/mm/yyyy format 30/12/2019 Enter a date in dd/mm/yyyy format 30/02/1990 Enter a date in dd/mm/yyyy format 12/12/12
Date is valid Date is invalid Date is invalid
In the above code snippet, we have created an object of DateFormat class and passed a format for the date in the constructor.
By default setLenient() method is true i.e it won’t check if the date exists in reality or not.
Hence we have made it false so that it checks whether the given date exists or not.
In the check date method, we have written a regular expression which checks the following:-
1. dd -> 1-31 2. mm -> 1-12 3. yyyy -> 4 digit number
I hope you have understood the above program.
If you have any doubts or suggestions please leave a comment down below.
Проверьте, является ли строка Допустимой датой в Java
В этом уроке мы обсудим различные способы проверки того, содержит ли Строка допустимую дату в Java.
Мы обсудим решения до Java 8, после Java 8 и с использованием валидатора Apache Commons .
2. Обзор Проверки данных
Всякий раз, когда мы получаем данные в любом приложении, нам необходимо убедиться, что они действительны, прежде чем выполнять дальнейшую обработку.
В случае ввода данных нам может потребоваться проверить следующее:
- Входные данные содержат дату в допустимом формате, например ММ/ДД/ГГГГ
- Различные части входных данных находятся в допустимом диапазоне
- Входные данные преобразуются в действительную дату в календаре
Для этого мы можем использовать регулярные выражения. Однако регулярные выражения для обработки различных форматов и языков ввода сложны и подвержены ошибкам. Кроме того, они могут ухудшить производительность.
Мы обсудим различные способы реализации проверки данных гибким, надежным и эффективным способом.
Во-первых, давайте напишем интерфейс для проверки данных:
public interface DateValidator
В следующих разделах мы реализуем этот интерфейс, используя различные подходы.
3. Проверьте С помощью DateFormat
Java с самого начала предоставляла возможности для форматирования и анализа дат. Эта функциональность находится в DateFormat абстрактном классе и его реализации — SimpleDateFormat .
Давайте реализуем проверку данных с помощью метода parse класса DateFormat :
public class DateValidatorUsingDateFormat implements DateValidator < private String dateFormat; public DateValidatorUsingDateFormat(String dateFormat) < this.dateFormat = dateFormat; >@Override public boolean isValid(String dateStr) < DateFormat sdf = new SimpleDateFormat(this.dateFormat); sdf.setLenient(false); try < sdf.parse(dateStr); >catch (ParseException e) < return false; >return true; > >
Поскольку Формат Даты и связанные классы не являются потокобезопасными , мы создаем новый экземпляр для каждого вызова метода.
Далее давайте напишем модульный тест для этого класса:
DateValidator validator = new DateValidatorUsingDateFormat("MM/dd/yyyy"); assertTrue(validator.isValid("02/28/2019")); assertFalse(validator.isValid("02/30/2019"));
Это было наиболее распространенным решением до Java 8.
4. Проверьте С Помощью LocalDate
Java 8 представила улучшенный API даты и времени . Он добавил класс LocalDate , который представляет дату без времени. Этот класс является неизменяемым и потокобезопасным.
Локальная дата предоставляет два статических метода для анализа дат. Оба они используют DateTimeFormatter для фактического анализа:
public static LocalDate parse(CharSequence text) // parses dates using using DateTimeFormatter.ISO_LOCAL_DATE public static LocalDate parse(CharSequence text, DateTimeFormatter formatter) // parses dates using the provided formatter
Давайте используем метод parse для реализации проверки данных:
public class DateValidatorUsingLocalDate implements DateValidator < private DateTimeFormatter dateFormatter; public DateValidatorUsingLocalDate(DateTimeFormatter dateFormatter) < this.dateFormatter = dateFormatter; >@Override public boolean isValid(String dateStr) < try < LocalDate.parse(dateStr, this.dateFormatter); >catch (DateTimeParseException e) < return false; >return true; > >
Реализация использует объект DateTimeFormatter для форматирования. Поскольку этот класс потокобезопасен, мы используем один и тот же экземпляр для разных вызовов методов.
Давайте также добавим модульный тест для этой реализации:
DateTimeFormatter dateFormatter = DateTimeFormatter.BASIC_ISO_DATE; DateValidator validator = new DateValidatorUsingLocalDate(dateFormatter); assertTrue(validator.isValid("20190228")); assertFalse(validator.isValid("20190230"));
5. Проверка с помощью DateTimeFormatter
В предыдущем разделе мы видели, что LocalDate использует DateTimeFormatter объект для синтаксического анализа. Мы также можем использовать класс DateTimeFormatter непосредственно для форматирования и синтаксического анализа.
DateTimeFormatter анализирует текст в два этапа. На этапе 1 он анализирует текст в различные поля даты и времени в зависимости от конфигурации. На этапе 2 он преобразует проанализированные поля в объект даты и/или времени.
Атрибут ResolverStyle управляет этапом 2. Это перечисление , имеющее три возможных значения:
- СНИСХОДИТЕЛЬНО – разрешает даты и время снисходительно
- ИНТЕЛЛЕКТУАЛЬНОЕ – интеллектуальное разрешение дат и времени
- СТРОГО – строго определяет даты и время
Теперь давайте запишем проверку данных с помощью DateTimeFormatter напрямую:
public class DateValidatorUsingDateTimeFormatter implements DateValidator < private DateTimeFormatter dateFormatter; public DateValidatorUsingDateTimeFormatter(DateTimeFormatter dateFormatter) < this.dateFormatter = dateFormatter; >@Override public boolean isValid(String dateStr) < try < this.dateFormatter.parse(dateStr); >catch (DateTimeParseException e) < return false; >return true; > >
Далее давайте добавим модульный тест для этого класса:
DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("uuuu-MM-dd", Locale.US) .withResolverStyle(ResolverStyle.STRICT); DateValidator validator = new DateValidatorUsingDateTimeFormatter(dateFormatter); assertTrue(validator.isValid("2019-02-28")); assertFalse(validator.isValid("2019-02-30"));
В приведенном выше тесте мы создаем DateTimeFormatter на основе шаблона и локали. Мы используем строгое разрешение для дат.
6. Проверка С Помощью Валидатора Apache Commons
Проект Apache Commons предоставляет платформу проверки. Это содержит процедуры проверки, такие как дата, время, номера, валюта, IP-адрес, адрес электронной почты и URL.
Для нашей цели в этой статье давайте рассмотрим класс GenericValidator , который предоставляет несколько методов для проверки того, содержит ли строка допустимую дату:
public static boolean isDate(String value, Locale locale) public static boolean isDate(String value,String datePattern, boolean strict)
Чтобы использовать библиотеку, давайте добавим в наш проект зависимость commons-validator Maven:
commons-validator commons-validator 1.6
Далее, давайте использовать класс GenericValidator для проверки дат:
assertTrue(GenericValidator.isDate("2019-02-28", "yyyy-MM-dd", true)); assertFalse(GenericValidator.isDate("2019-02-29", "yyyy-MM-dd", true));
7. Заключение
В этой статье мы рассмотрели различные способы проверки того, содержит ли строка допустимую дату.
Как обычно, полный исходный код можно найти на GitHub .
Читайте ещё по теме:
Java — how to check if String is valid date?
Geo-Baby
1. Overview
In this post we can find code which can validate if String contains valid Date based on defined pattern.
2. With SimpleDateFormat
import java.text.ParseException; import java.text.SimpleDateFormat; public class Example1 < public static void main(String[] args) < System.out.println(checkIfDateIsValid("2019-10-13")); // true System.out.println(checkIfDateIsValid("2019:10:13")); // false >private static boolean checkIfDateIsValid(String date) < SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd"); // With lenient parsing, the parser may use heuristics to interpret // inputs that do not precisely match this object's format. format.setLenient(false); try < format.parse(date); >catch (ParseException e) < return false; >return true; > >
3. With SimpleDateFormat + different patterns
import java.text.ParseException; import java.text.SimpleDateFormat; public class Example2 < public static void main(String[] args) < System.out.println("# Example 1"); System.out.println(checkIfDateIsValid("yyyy-MM-dd", "2019-10-13")); // true System.out.println(checkIfDateIsValid("yyyy-MM-dd", "2019:10:13")); // false System.out.println("# Example 2"); System.out.println(checkIfDateIsValid("yyyy/MM/dd", "2019/10/13")); // true System.out.println("# Example 3"); System.out.println(checkIfDateIsValid("yyyy:MM:dd", "2019:10:13")); // true System.out.println("# Example 4"); System.out.println(checkIfDateIsValid("MM/dd/yyyy", "10/13/2019")); // true >private static boolean checkIfDateIsValid(String pattern, String date) < SimpleDateFormat format = new SimpleDateFormat(pattern); // With lenient parsing, the parser may use heuristics to interpret // inputs that do not precisely match this object's format. format.setLenient(false); try < format.parse(date); >catch (ParseException e) < return false; >return true; > >
# Example 1 true false # Example 2 true # Example 3 true # Example 4 true
4. LocalDate — Java 8
import java.time.LocalDate; import java.time.format.DateTimeFormatter; import java.time.format.DateTimeParseException; public class Example3 < public static void main(String[] args) < System.out.println(checkIfDateIsValid("2019-10-13")); // true System.out.println(checkIfDateIsValid("2019:10:13")); // false >private static boolean checkIfDateIsValid(String date) < try < LocalDate.parse(date, DateTimeFormatter.ISO_DATE); >catch (DateTimeParseException e) < return false; >return true; > >
5. LocalDate + DateTimeFormatter build-in patterns
import java.time.LocalDate; import java.time.format.DateTimeFormatter; import java.time.format.DateTimeParseException; public class Example4 < public static void main(String[] args) < System.out.println("# Example 1"); System.out.println(checkIfDateIsValid( DateTimeFormatter.ISO_DATE, "2019-10-13")); // true System.out.println(checkIfDateIsValid( DateTimeFormatter.ISO_DATE, "2019:10:13")); // false System.out.println("# Example 2"); System.out.println(checkIfDateIsValid( DateTimeFormatter.BASIC_ISO_DATE, "20191013")); // true System.out.println("# Example 3"); System.out.println(checkIfDateIsValid( DateTimeFormatter.ISO_LOCAL_DATE, "2019-10-13")); // true >private static boolean checkIfDateIsValid(DateTimeFormatter formatter, String date) < try < LocalDate.parse(date, formatter); >catch (DateTimeParseException e) < return false; >return true; > >
# Example 1 true false # Example 2 true # Example 3 true
6. LocalDate + DateTimeFormatter different patterns
import java.time.LocalDate; import java.time.format.DateTimeFormatter; import java.time.format.DateTimeParseException; public class Example5 < public static void main(String[] args) < System.out.println("# Example 1"); System.out.println(checkIfDateIsValid("yyyy-MM-dd", "2019-10-13")); // true System.out.println(checkIfDateIsValid("yyyy-MM-dd", "2019:10:13")); // false System.out.println("# Example 2"); System.out.println(checkIfDateIsValid("yyyy/MM/dd", "2019/10/13")); // true System.out.println("# Example 3"); System.out.println(checkIfDateIsValid("yyyy:MM:dd", "2019:10:13")); // true System.out.println("# Example 4"); System.out.println(checkIfDateIsValid("MM/dd/yyyy", "10/13/2019")); // true >private static boolean checkIfDateIsValid(String pattern, String date) < try < DateTimeFormatter formatter = DateTimeFormatter.ofPattern(pattern); LocalDate.parse(date, formatter); >catch (DateTimeParseException e) < return false; >return true; > >
# Example 1 true false # Example 2 true # Example 3 true # Example 4 true