Ellenőrizze, hogy egy karakterlánc érvényes dátum-e a Java-ban

1. Bemutatkozás

Ebben az oktatóanyagban megvitatjuk a különböző módokat annak ellenőrzésére, hogy a Húr érvényes dátumot tartalmaz Java-ban.

Megbeszéljük a megoldásokat a Java 8 előtt, a Java 8 után és az Apache Commons Validator használatával.

2. A dátum érvényesítésének áttekintése

Amikor adatot kapunk bármely alkalmazásból, a további feldolgozás előtt meg kell győződnünk arról, hogy azok érvényesek-e.

Dátumadatok esetén szükség lehet a következők ellenőrzésére:

  • A bemenet a dátumot érvényes formátumban tartalmazza, például HH / NN / ÉÉÉÉ
  • A bemenet különböző részei érvényes tartományban vannak
  • A bemenet érvényes dátumra változik a naptárban

A fentiekhez használhatunk reguláris kifejezéseket. A különféle bemeneti formátumok és lokalizációk kezelésére szolgáló rendszeres kifejezések azonban összetettek és hajlamosak hibára. Ezen felül ronthatják a teljesítményt.

Megbeszéljük a dátumellenőrzések rugalmas, robusztus és hatékony megvalósításának különböző módjait.

Először írjunk egy felületet a dátum érvényesítéséhez:

nyilvános felület DateValidator {logikai isValid (String dateStr); }

A következő szakaszokban ezt a felületet valósítjuk meg a különböző megközelítések segítségével.

3. Ellenőrizze a használatát Dátum formátum

A Java a kezdetek óta biztosítja a dátumok formázását és elemzését. Ez a funkció a Dátum formátum absztrakt osztály és annak megvalósítása - SimpleDateFormat.

Végezzük el a dátum érvényesítését a elemzés módszere Dátum formátum osztály:

public class DateValidatorUsingDateFormat megvalósítja a DateValidator {private String dateFormat; public DateValidatorUsingDateFormat (String dateFormat) {this.dateFormat = dateFormat; } @Orride public boolean isValid (String dateStr) {DateFormat sdf = new SimpleDateFormat (this.dateFormat); sdf.setLenient (hamis); próbáld ki a {sdf.parse (dateStr) parancsot; } catch (ParseException e) {return false; } return true; }}

Mivel a Dátum formátum és a kapcsolódó osztályok nem szálbiztosak, minden példányhíváshoz új példányt hozunk létre.

Ezután írjuk meg az egység tesztet ehhez az osztályhoz:

DateValidator validator = új DateValidatorUsingDateFormat ("HH / nn / éééé"); assertTrue (validator.isValid ("2019.02.28.")); assertFalse (validator.isValid ("2019.02.30."));

Ez volt a leggyakoribb megoldás a Java 8 előtt.

4. Ellenőrizze a használatát LocalDate

A Java 8 továbbfejlesztett dátum és idő API-t vezetett be. Hozzátette a LocalDate osztály, amely az idő nélküli dátumot képviseli. Ez az osztály változhatatlan és menetbiztos.

LocalDate két statikus módszert biztosít a dátumok elemzésére. Mindkettőjük a DateTimeFormatter a tényleges elemzéshez:

public static LocalDate elemzés (CharSequence szöveg) // a DateTimeFormatter használatával elemzi a dátumokat. ISO_LOCAL_DATE public static LocalDate parse (CharSequence text, DateTimeFormatter formatter) // a megadott formázóval elemzi a dátumokat

Használjuk a elemzés módszer a dátum érvényesítésének végrehajtására:

public class DateValidatorUsingLocalDate megvalósítja a DateValidator {private DateTimeFormatter dateFormatter; public DateValidatorUsingLocalDate (DateTimeFormatter dateFormatter) {this.dateFormatter = dateFormatter; } @Orride public boolean isValid (String dateStr) {try {LocalDate.parse (dateStr, this.dateFormatter); } catch (DateTimeParseException e) {return false; } return true; }}

A megvalósítás a DateTimeFormatter objektum a formázáshoz. Mivel ez az osztály szálbiztos, ugyanazt a példányt használjuk különböző metódushívások során.

Adjunk hozzá egy egység tesztet is ehhez a megvalósításhoz:

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

5. Ellenőrizze a használatát DateTimeFormatter

Az előző részben ezt láttuk LocalDate használja a DateTimeFormatter elemzés tárgya. Használhatjuk a DateTimeFormatter osztály közvetlenül a formázáshoz és az elemzéshez.

DateTimeFormatter a szöveget két szakaszban elemzi. Az 1. fázisban a szöveget a dátum és az idő mezőibe elemzi a konfiguráció alapján. A 2. szakaszban az elemzett mezőket dátum- és / vagy időobjektummá alakítja.

A ResolverStyle attribútum vezérlések 2. fázis. Ez egy enum három lehetséges értékkel:

  • HITELES - engedékenyen oldja meg a dátumokat és időpontokat
  • SMART - intelligens módon oldja meg a dátumokat és időpontokat
  • SZIGORÚ - szigorúan feloldja a dátumokat és időpontokat

Most írjuk a dátum érvényesítését a segítségével DateTimeFormatter közvetlenül:

public class DateValidatorUsingDateTimeFormatter megvalósítja a DateValidator {private DateTimeFormatter dateFormatter; public DateValidatorUsingDateTimeFormatter (DateTimeFormatter dateFormatter) {this.dateFormatter = dateFormatter; } @Orride public boolean isValid (String dateStr) {try {this.dateFormatter.parse (dateStr); } catch (DateTimeParseException e) {return false; } return true; }}

Ezután adjuk hozzá az egység tesztet ehhez az osztályhoz:

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

A fenti tesztben létrehozunk egy DateTimeFormatter minta és területi beállítás alapján. A szigorú határozatot alkalmazzuk az időpontokra.

6. Érvényesítés az Apache Commons Validator használatával

Az Apache Commons projekt egy érvényesítési keretet biztosít. Ez olyan ellenőrzési rutinokat tartalmaz, mint a dátum, az idő, a számok, a pénznem, az IP-cím, az e-mail és az URL.

Ebben a cikkben szereplő célunk érdekében vessünk egy pillantást a GenericValidator osztály, amely néhány módszert biztosít annak ellenőrzésére, hogy a Húr érvényes dátumot tartalmaz:

nyilvános statikus logikai isDate (karakterlánc értéke, területi beállítás), public static logikai isDate (karakterlánc értéke, String datePattern, logikai szigorú)

A könyvtár használatához adjuk hozzá a commons-validator Maven-függőség projektünktől:

 commons-validator commons-validátor 1.6 

Ezután használjuk a GenericValidator osztály a dátumok érvényesítéséhez:

assertTrue (GenericValidator.isDate ("2019-02-28", "éééé-hh-dd", igaz)); assertFalse (GenericValidator.isDate ("2019-02-29", "éééé-hh-dd", igaz));

7. Következtetés

Ebben a cikkben megvizsgáltuk a különböző módokat annak ellenőrzésére, hogy a Húr érvényes dátumot tartalmaz.

Szokás szerint a teljes forráskód megtalálható a GitHubon.