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.