Skontrolujte, či je reťazec v Jave platný dátum

1. Úvod

V tomto výučbe sa dozvieme o rôznych spôsoboch kontroly, či a String obsahuje platný dátum v Jave.

Prediskutujeme riešenia pred jazykom Java 8, po prostredí Java 8 a pomocou nástroja Apache Commons Validator.

2. Prehľad overenia dátumu

Kedykoľvek dostaneme údaje v akejkoľvek aplikácii, musíme si pred ďalším spracovaním overiť, či sú platné.

V prípade dátumových vstupov bude možno potrebné overiť nasledovné:

  • Vstup obsahuje dátum v platnom formáte, napríklad MM / DD / RRRR
  • Rôzne časti vstupu sú v platnom rozsahu
  • Vstup sa vyrieši na platný dátum v kalendári

Na to môžeme použiť regulárne výrazy. Regulárne výrazy na spracovanie rôznych vstupných formátov a miestnych nastavení sú však zložité a náchylné na chyby. Okrem toho môžu znížiť výkon.

Budeme diskutovať o rôznych spôsoboch implementácie overenia dátumu flexibilným, robustným a efektívnym spôsobom.

Najskôr napíšeme rozhranie na overenie dátumu:

verejné rozhranie DateValidator {boolean isValid (String dateStr); }

V ďalších častiach budeme toto rozhranie implementovať pomocou rôznych prístupov.

3. Overte použitie Formát dátumu

Java poskytuje prostriedky na formátovanie a analýzu dátumov od začiatku. Táto funkcionalita je v Formát dátumu abstraktná trieda a jej implementácia - SimpleDateFormat.

Implementujme overenie dátumu pomocou analyzovať metóda Formát dátumu trieda:

verejná trieda DateValidatorUsingDateFormat implementuje DateValidator {private String dateFormat; public DateValidatorUsingDateFormat (reťazec dateFormat) {this.dateFormat = dateFormat; } @Override public boolean isValid (String dateStr) {DateFormat sdf = new SimpleDateFormat (this.dateFormat); sdf.setLenient (false); skus {sdf.parse (dateStr); } catch (ParseException e) {return false; } návrat pravdivý; }}

Odkedy the Formát dátumu a súvisiace triedy nie sú bezpečné pre vlákna, vytvárame novú inštanciu pre každé volanie metódy.

Ďalej napíšeme test jednotky pre túto triedu:

DateValidator validator = nový DateValidatorUsingDateFormat ("MM / dd / rrrr"); assertTrue (validator.isValid ("28/28/2019")); assertFalse (validator.isValid ("30/30/2019"));

Toto bolo najbežnejšie riešenie pred Java 8.

4. Overte použitie LocalDate

Java 8 predstavila vylepšené rozhranie API pre dátum a čas. To pridalo LocalDate triedy, čo predstavuje dátum bez času. Táto trieda je nemenná a bezpečná pre vlákna.

LocalDate poskytuje dve statické metódy na analýzu dátumov. Obaja používajú a DateTimeFormatter vykonať skutočnú analýzu:

verejná statická analýza LocalDate (text CharSequence) // analyzuje dátumy pomocou nástroja DateTimeFormatter.ISO_LOCAL_DATE verejná statická analýza LocalDate (text CharSequence, formátovač DateTimeFormatter) // analyzuje dátumy pomocou poskytnutého formátovača

Použime analyzovať spôsob implementácie overenia dátumu:

verejná trieda DateValidatorUsingLocalDate implementuje 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; } návrat pravdivý; }}

Implementácia využíva a DateTimeFormatter objekt na formátovanie. Pretože je táto trieda bezpečná pre vlákna, používame rovnakú inštanciu v rámci rôznych volaní metód.

Pre túto implementáciu pridáme aj jednotkový test:

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

5. Overte použitie DateTimeFormatter

V predchádzajúcej časti sme to videli LocalDate používa a DateTimeFormatter objekt na analýzu. Môžeme tiež použiť DateTimeFormatter triedy priamo na formátovanie a analýzu.

DateTimeFormatter analyzuje text v dvoch fázach. Vo fáze 1 analyzuje text na rôzne polia dátumu a času na základe konfigurácie. Vo fáze 2 rozloží analyzované polia na objekt dátumu a / alebo času.

The ResolverStyle atribút riadi fázu 2. Je to enum majú tri možné hodnoty:

  • LENIENT - dátumy a časy rieši zhovievavo
  • SMART - inteligentne rieši dátumy a časy
  • STRICT - striktne rieši dátumy a časy

Teraz napíšeme validáciu dátumu pomocou DateTimeFormatter priamo:

verejná trieda DateValidatorUsingDateTimeFormatter implementuje 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; } návrat pravdivý; }}

Ďalej pridáme test jednotky pre túto triedu:

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

Vo vyššie uvedenom teste vytvárame a DateTimeFormatter na základe vzoru a miestneho nastavenia. Pre dátumy používame prísne rozlíšenie.

6. Overte pomocou nástroja Apache Commons Validator

Projekt Apache Commons poskytuje overovací rámec. Obsahuje overovacie rutiny, ako napríklad dátum, čas, čísla, mena, adresa IP, e-mail a adresa URL.

Za náš cieľ v tomto článku sa pozrime na Generic Validator triedy, ktorá poskytuje niekoľko metód na kontrolu, či a String obsahuje platný dátum:

public static boolean isDate (String value, Locale locale) public static boolean isDate (String value, String datePattern, boolean strict)

Ak chcete používať knižnicu, pridajme spoločný validátor Závislosť závislá od nášho projektu:

 Commons-Validator Commons-Validator 1.6 

Ďalej použijeme Generic Validator trieda na overenie dátumov:

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

7. Záver

V tomto článku sme sa pozreli na rôzne spôsoby, ako skontrolovať, či a String obsahuje platný dátum.

Celý zdrojový kód nájdete ako obvykle na GitHub.