Kontroller, om en streng er en gyldig dato i Java

1. Introduktion

I denne vejledning diskuterer vi de forskellige måder at kontrollere, om en Snor indeholder en gyldig dato i Java.

Vi diskuterer løsningerne før Java 8, efter Java 8 og brug af Apache Commons Validator.

2. Datovalideringsoversigt

Hver gang vi modtager data i en hvilken som helst applikation, skal vi kontrollere, at de er gyldige, inden vi foretager yderligere behandling.

I tilfælde af datoinput skal vi muligvis kontrollere følgende:

  • Inputet indeholder datoen i et gyldigt format, såsom MM / DD / ÅÅÅÅ
  • De forskellige dele af input er inden for et gyldigt interval
  • Inputet løses til en gyldig dato i kalenderen

Vi kan bruge regulære udtryk til at gøre ovenstående. Imidlertid er regulære udtryk til håndtering af forskellige inputformater og lokaliteter komplekse og fejlbehæftede. Derudover kan de forringe ydeevnen.

Vi diskuterer de forskellige måder at implementere datavalideringer på en fleksibel, robust og effektiv måde.

Lad os først skrive en grænseflade til datovalidering:

offentlig grænseflade DateValidator {boolean isValid (String dateStr); }

I de næste sektioner implementerer vi denne grænseflade ved hjælp af de forskellige tilgange.

3. Valider med brug Datoformat

Java har leveret faciliteter til at formatere og parse datoer siden starten. Denne funktionalitet findes i Datoformat abstrakt klasse og dens implementering - SimpleDateFormat.

Lad os implementere datovalidering ved hjælp af parse metode til Datoformat klasse:

offentlig klasse DateValidatorUsingDateFormat implementerer 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 (falsk); prøv {sdf.parse (dateStr); } fange (ParseException e) {returner falsk; } returner sandt }}

Siden det Datoformat og relaterede klasser er ikke trådsikre, vi opretter en ny instans for hvert metodeopkald.

Lad os derefter skrive enhedstesten til denne klasse:

DateValidator validator = ny DateValidatorUsingDateFormat ("MM / dd / åååå"); assertTrue (validator.isValid ("02/28/2019")); assertFalse (validator.isValid ("02/30/2019"));

Dette har været den mest almindelige løsning før Java 8.

4. Valider med brug LocalDate

Java 8 introducerede en forbedret Date and Time API. Det tilføjede LocalDate klasse, som repræsenterer datoen uden tid. Denne klasse er uforanderlig og trådsikker.

LocalDate giver to statiske metoder til at analysere datoer. Begge bruger en DateTimeFormatter at foretage den faktiske parsing:

offentlig statisk analyse af LocalDate (CharSequence-tekst) // analyserer datoer ved hjælp af DateTimeFormatter.ISO_LOCAL_DATE offentlig statisk LocalDate-analyse (CharSequence-tekst, DateTimeFormatter-formatering) // analyserer datoer ved hjælp af den angivne formatter

Lad os bruge parse metode til implementering af datavalidering:

offentlig klasse DateValidatorUsingLocalDate implementerer DateValidator {privat DateTimeFormatter dateFormatter; public DateValidatorUsingLocalDate (DateTimeFormatter dateFormatter) {this.dateFormatter = dateFormatter; } @Override offentlig boolsk isValid (String dateStr) {prøv {LocalDate.parse (dateStr, this.dateFormatter); } fange (DateTimeParseException e) {return false; } returner sandt }}

Implementeringen bruger en DateTimeFormatter objekt til formatering. Da denne klasse er trådsikker, bruger vi den samme forekomst på tværs af forskellige metodeopkald.

Lad os også tilføje en enhedstest til denne implementering:

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

5. Valider med brug DateTimeFormatter

I det forrige afsnit så vi det LocalDate bruger en DateTimeFormatter objekt til parsing. Vi kan også bruge DateTimeFormatter klasse direkte til formatering og parsing.

DateTimeFormatter analyserer en tekst i to faser. I fase 1 analyserer den teksten i forskellige dato- og tidsfelter baseret på konfigurationen. I fase 2 løser den de parsede felter til et dato- og / eller tidsobjekt.

Det ResolverStyle attribut kontrollerer fase 2. Det er en enum med tre mulige værdier:

  • LENIENT - løser datoer og tidspunkter mildt
  • SMART - løser datoer og tidspunkter på en intelligent måde
  • STRICT - løser strengt datoer og tidspunkter

Lad os nu skrive datavalidering ved hjælp af DateTimeFormatter direkte:

offentlig klasse DateValidatorUsingDateTimeFormatter implementerer DateValidator {privat DateTimeFormatter dateFormatter; public DateValidatorUsingDateTimeFormatter (DateTimeFormatter dateFormatter) {this.dateFormatter = dateFormatter; } @ Override public boolean isValid (String dateStr) {prøv {this.dateFormatter.parse (dateStr); } fange (DateTimeParseException e) {return false; } returner sandt }}

Lad os derefter tilføje enhedstesten til denne klasse:

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

I ovenstående test opretter vi en DateTimeFormatter baseret på mønster og lokalitet. Vi bruger den strenge opløsning til datoer.

6. Valider med Apache Commons Validator

Apache Commons-projektet giver en valideringsramme. Dette indeholder valideringsrutiner, såsom dato, klokkeslæt, numre, valuta, IP-adresse, e-mail og URL.

Lad os se på vores mål i denne artikel GenericValidator klasse, som giver et par metoder til at kontrollere, om en Snor indeholder en gyldig dato:

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

For at bruge biblioteket, lad os tilføje commons-validator Maven afhængighed af vores projekt:

 commons-validator commons-validator 1.6 

Lad os derefter bruge GenericValidator klasse for at validere datoer:

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

7. Konklusion

I denne artikel så vi på de forskellige måder at kontrollere, om en Snor indeholder en gyldig dato.

Som sædvanlig kan den fulde kildekode findes på GitHub.