Java check if string is date

Проверьте, является ли строка Допустимой датой в 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

References

Источник

Check if String is valid Date in Java

In Java, we play a lot with Dates. Here’s one more scenario. You have a string which has date in it. You want to convert it into a valid java.util.Date object. Now in Java you can convert a String to Date using SimpleDateFormat class. But we will add a little more complexity on that. Lets say the date format in String is not fixed. User might enter date in format “dd/mm/yyy” or “dd-mm-yyyy” or “dd.mmm.yy”! In any of such case we should get a valid java.util.Date object. Here’s a simple Util class that you can use to convert String having date in multiple formats to java.util.Date object.

package net.viralpatel.java; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; public class DateUtil < // List of all date formats that we want to parse. // Add your own format here. private static List; dateFormats = new ArrayList() new SimpleDateFormat("M/dd/yyyy")); add(new SimpleDateFormat("dd.M.yyyy")); add(new SimpleDateFormat("M/dd/yyyy hh:mm:ss a")); add(new SimpleDateFormat("dd.M.yyyy hh:mm:ss a")); add(new SimpleDateFormat("dd.MMM.yyyy")); add(new SimpleDateFormat("dd-MMM-yyyy")); > >; /** * Convert String with various formats into java.util.Date * * @param input * Date as a string * @return java.util.Date object if input string is parsed * successfully else returns null */ public static Date convertToDate(String input) < Date date = null; if(null == input) < return null; > for (SimpleDateFormat format : dateFormats) < try < format.setLenient(false); date = format.parse(input); > catch (ParseException e) < //Shhh.. try other formats > if (date != null) < break; > > return date; > >
Code language: Java (java)

The above code has a list of SimpleDateFormat objects that holds different valid date formats that you want to parse. Add a new format if you want your code to parse it. Also check the convertToDate() method. It runs through each format from the list and check weather input string is valid date or not. If it is successful in converting String to Date, it returns the Date object. If it fails to convert String to Date then it returns null. Let’s test this with various input:

package net.viralpatel.java; public class TestDateUtil < public static void main(String[] args) < System.out.println("10/14/2012" + " hljs-string">"10/14/2012")); System.out.println("10-Jan-2012" + " hljs-string">"10-Jan-2012")); System.out.println("01.03.2002" + " hljs-string">"01.03.2002")); System.out.println("12/03/2010" + " hljs-string">"12/03/2010")); System.out.println("19.Feb.2011" + " hljs-string">"19.Feb.2011" )); System.out.println("4/20/2012" + " hljs-string">"4/20/2012")); System.out.println("some string" + " hljs-string">"some string")); System.out.println("123456" + " hljs-string">"123456")); System.out.println("null" + " hljs-keyword">null)); > >
Code language: Java (java)
10/14/2012 = Sun Oct 14 00:00:00 CEST 2012 10-Jan-2012 = Tue Jan 10 00:00:00 CET 2012 01.03.2002 = Fri Mar 01 00:00:00 CET 2002 12/03/2010 = Fri Dec 03 00:00:00 CET 2010 19.Feb.2011 = Sat Feb 19 00:00:00 CET 2011 4/20/2012 = Fri Apr 20 00:00:00 CEST 2012 some string = null 123456 = null null = null
Code language: JavaScript (javascript)

Thus you can quickly check weather given string is a valid Date or not using DateUtil class.

Update: SimpleDateFormat and Thread Safety

Many developers have commented on this post about the issue of Thread safety in this code snippet. As SimpleDateFormat class itself is not thread safe it can cause issues in production. Here’s a workaround for this problem. Instead of SimpleDateFormat class in above utility method, use below ThreadSafeSimpleDateFormat class. This will solve the problem of Thread safety.

package net.viralpatel.java; public class ThreadSafeSimpleDateFormat < private DateFormat df; public ThreadSafeSimpleDateFormat(String format) < this.df = new SimpleDateFormat(format); > public synchronized String format(Date date) < return df.format(date); > public synchronized Date parse(String string) throws ParseException < return df.parse(string); > >
Code language: Java (java)

Thanks for your valuable comments 🙂

Источник

Читайте также:  Селекторы css виды составные селекторы атрибуты
Оцените статью