Provjerite je li niz valjani datum na Javi

1. Uvod

U ovom uputstvu razgovarat ćemo o različitim načinima provjere je li a Niz sadrži valjani datum u Javi.

Razmotrit ćemo rješenja prije Jave 8, nakon Jave 8 i koristeći Apache Commons Validator.

2. Pregled provjere valjanosti datuma

Kad god primimo podatke u bilo kojoj aplikaciji, moramo provjeriti je li valjana prije daljnje obrade.

U slučaju unosa datuma, možda ćemo trebati provjeriti sljedeće:

  • Ulaz sadrži datum u važećem formatu, kao što je MM / DD / GGGG
  • Razni dijelovi unosa nalaze se u važećem rasponu
  • Unos se pretvara u važeći datum u kalendaru

Za gore navedeno možemo koristiti regularne izraze. Međutim, regularni izrazi za obradu različitih formata unosa i lokalizacija složeni su i skloni pogreškama. Osim toga, mogu pogoršati performanse.

Razgovarat ćemo o različitim načinima primjene provjera valjanosti na fleksibilan, robustan i učinkovit način.

Prvo napišimo sučelje za provjeru datuma:

javno sučelje DateValidator {boolean isValid (String dateStr); }

U sljedećim odjeljcima implementirat ćemo ovo sučelje koristeći različite pristupe.

3. Potvrdite pomoću Oblik datuma

Java je od početka pružala mogućnosti formatiranja i raščlanjivanja datuma. Ova je funkcionalnost u Oblik datuma apstraktni tečaj i njegova implementacija - SimpleDateFormat.

Primijenimo provjeru datuma pomoću raščlaniti metoda Oblik datuma razred:

javna klasa DateValidatorUsingDateFormat implementira DateValidator {private String dateFormat; javni DateValidatorUsingDateFormat (niz dateFormat) {this.dateFormat = dateFormat; } @Override public boolean isValid (String dateStr) {DateFormat sdf = new SimpleDateFormat (this.dateFormat); sdf.setLenient (lažno); isprobajte {sdf.parse (dateStr); } catch (ParseException e) {return false; } return true; }}

Od the Oblik datuma a srodne klase nisu zaštićene niti, stvaramo novu instancu za svaki poziv metode.

Dalje, napišimo jedinični test za ovu klasu:

DateValidator validator = novi DateValidatorUsingDateFormat ("MM / dd / gggg"); assertTrue (validator.isValid ("28.02.2019.")); assertFalse (validator.isValid ("30.02.2019"));

Ovo je bilo najčešće rješenje prije Jave 8.

4. Potvrdite pomoću LocalDate

Java 8 predstavila je poboljšani API za datum i vrijeme. Dodao je LocalDate klase, koja predstavlja datum bez vremena. Ova je klasa nepromjenjiva i zaštićena od niti.

LocalDate pruža dvije statičke metode za raščlanjivanje datuma. Oboje koriste a DateTimeFormatter kako biste izvršili stvarno raščlanjivanje:

javno statičko raščlanjivanje LocalDate (tekst CharSequence) // raščlanjivanje datuma pomoću DateTimeFormatter.ISO_LOCAL_DATE javno statično raščlanjivanje LocalDate (tekst CharSequence, format datotekama DateTimeFormatter) // raščlanjivanje datuma pomoću predviđenog oblikovača

Iskoristimo raščlaniti metoda za provedbu provjere datuma:

javna klasa DateValidatorUsingLocalDate implementira DateValidator {private DateTimeFormatter dateFormatter; javni 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; }}

Provedba koristi a DateTimeFormatter objekt za formatiranje. Budući da je ova klasa zaštićena od niti, koristimo istu instancu u različitim pozivima metoda.

Dodajmo i jedinični test za ovu implementaciju:

DateTimeFormatter dateFormatter = DateTimeFormatter.BASIC_ISO_DATE; DateValidator validator = novi DateValidatorUsingLocalDate (dateFormatter); assertTrue (validator.isValid ("20190228")); assertFalse (validator.isValid ("20190230"));

5. Potvrdite pomoću DateTimeFormatter

U prethodnom smo odjeljku to vidjeli LocalDate koristi a DateTimeFormatter objekt za raščlanjivanje. Također možemo koristiti DateTimeFormatter klasa izravno za formatiranje i raščlanjivanje.

DateTimeFormatter raščlanjuje tekst u dvije faze. U 1. fazi analizira tekst u različita polja datuma i vremena na temelju konfiguracije. U 2. fazi rješava raščlanjena polja u objekt datuma i / ili vremena.

The ResolverStyle kontrola atributa faza 2. To je an nabrajanje s tri moguće vrijednosti:

  • LENIENT - blago rješava datume i vremena
  • PAMETNO - inteligentno rješava datume i vremena
  • STRICT - strogo rješava datume i vremena

Sada, napišimo provjeru datuma pomoću DateTimeFormatter direktno:

javna klasa DateValidatorUsingDateTimeFormatter implementira DateValidator {private DateTimeFormatter dateFormatter; javni DateValidatorUsingDateTimeFormatter (DateTimeFormatter dateFormatter) {this.dateFormatter = dateFormatter; } @Override public boolean isValid (String dateStr) {try {this.dateFormatter.parse (dateStr); } catch (DateTimeParseException e) {return false; } return true; }}

Dalje, dodajmo jedinični test za ovu klasu:

DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern ("uuuu-MM-dd", Locale.US) .withResolverStyle (ResolverStyle.STRICT); DateValidator validator = novi DateValidatorUsingDateTimeFormatter (dateFormatter); assertTrue (validator.isValid ("2019-02-28")); assertFalse (validator.isValid ("2019-02-30"));

U gore navedenom testu izrađujemo DateTimeFormatter na temelju uzorka i lokalizacije. Za datume koristimo strogu rezoluciju.

6. Provjerite valjanost pomoću Apache Commons Validatora

Projekt Apache Commons pruža okvir za provjeru valjanosti. Sadrži rutine provjere valjanosti, kao što su datum, vrijeme, brojevi, valuta, IP adresa, e-pošta i URL.

Za naš cilj u ovom članku, pogledajmo GenericValidator klase, koja nudi nekoliko metoda za provjeru je li Niz sadrži valjani datum:

javni statički logički isDate (vrijednost niza, lokalizacija) javni statički logički isDate (vrijednost niza, datumski obrazac niza, logički strogi)

Da bismo koristili knjižnicu, dodajmo zajednički validator Mavenova ovisnost o našem projektu:

 commons-validator commons-validator 1.6 

Dalje, upotrijebimo GenericValidator razred za provjeru datuma:

assertTrue (GenericValidator.isDate ("2019-02-28", "yyyy-MM-dd", true)); assertFalse (GenericValidator.isDate ("2019-02-29", "yyyy-MM-dd", true));

7. Zaključak

U ovom smo članku pogledali razne načine kako provjeriti je li Niz sadrži valjani datum.

Kao i obično, puni izvorni kod možete pronaći na GitHubu.