当前位置: 首页 > 后端技术 > Java

Java中判断一个字符串是否为有效日期

时间:2023-04-01 22:44:19 Java

一、概念讨论Java中判断一个字符串是否包含有效日期的各种方法,包括Java8和ApacheCommonsValidator前后的解决方案。2.数据概述无论是应该还是方法,当接收到数据时,我们必须在处理之前验证其有效性。在输入日期的情况下,我们需要验证以下几点:输入包含有效的日期格式,如MM/DD/YYYY,输入的每一部分都在有效范围内,可以解析为有效日期在日历中我们可以使用正则表达式来完成以上工作,但是正则化在处理各种输入格式时比较复杂且容易出错,同时也会降低性能。下面讨论了各种灵活、稳健和高效的日期验证方法。首先,我们编写一个用于日期验证的接口。publicinterfaceDateValidator{booleanisValid(StringdateStr);}这个接口在下面以不同的方式实现。三、使用DateFormatJava从一开始就提供了格式化和解析日期的工具。这些函数在抽象类DateFormat及其实现类SimpleDateFormat中。让我们使用DateFormat实现日期验证。公共类DateValidatorUsingDateFormat实现DateValidator{privateStringdateFormat;publicDateValidatorUsingDateFormat(StringdateFormat){this.dateFormat=dateFormat;}@OverridepublicbooleanisValid(StringdateStr){DateFormatsdf=newSimpleDateFormat(this.dateFormat);//解析sdf.setLenient(false);尝试{sdf.parse(dateStr);}catch(ParseExceptione){返回false;}返回真;}}因为DateFormat相关的类不是线程安全的,所以我们需要新建一个实例。让我们写一个单元测试:assertTrue(validator.isValid("02/28/2019");}@TestpublicvoidgivenValidator_whenInvalidDatePassed_ThenFalse(){DateValidatorvalidator=newDateValidatorUsingDateFormat("MM/dd/yyyy");assertFalse(validator.isValid("02/30/2019"));}}这通常是Java8之前的解决方案。4.使用LocalDateJava8引入了改进的日期和时间API。添加了LocalDate类,它只表示日期。该类是线程安全的。LocalDate提供了两种解析日期的表达方法,这两种方法都使用DateTimeFormatter来解析:提供的格式化程序使用此解析方法来实现日期验证publicclassDateValidatorUsingLocalDateimplementsDateValidator{privateDateTimeFormatterdateFormatter;publicDateValidatorUsingLocalDate(DateTimeFormatterdateFormatter){this.dateFormatter=dateFormatter;}@OverridepublicbooleanisValid(StringdateLosStr){(dateStr,this.dateFormatter);}catch(DateTimeParseExceptione){返回false;}返回真;}}在下面编写单元测试publicclassDateValidatorUsingLocalDateUnitTest{DateTimeFormatterdateFormatter=DateTimeFormatter.BASIC_ISO_DATE;DateValidator验证器=newDateValidatorUsingForcal)(DateValidatorUsingForcal);@TestpublicvoidgivenValidator_whenValidDatePassed_ThenTrue(){assertTrue(validator.isValid("20190228"));}@TestpublicvoidgivenValidator_whenInValidDatePassed_ThenFalse(){assertFalse(validator.isValid("20190230}For"));在LocalDate使用DateTimeFormatter对象解析部分,我们也可以直接使用DateTimeFormatter类进行格式化解析,DateTimeFormatter分两个阶段解析文本。第一阶段,根据配置将日期字符串解析为日期和时间字段。阶段2,将这些日期和时间字段解析为对象。ResolverStyle控制阶段2,它有3个值://结论//ResolverStyleformatter.parse(text)LocalDate.parse(text,formatter)//-----------------------------------------------------------------//STRICT6.31,6.32不合理输出6.31,6.32抛出异常//SMART6.31计算为6.30和6.32抛出异常为左//LENIENT推迟6.31为7.1计算6.32为7.2计算为左//DateTimeFormatter.ofPatter("yyyy-MM-dd")是ResolverStyle.SMART模式下面是直接用DateTimeFormatter写日期校验:publicclassDateValidatorUsingDateTimeFormatterimplementsDateValidator{publicDateValidatorUsingDateTimeFormatter(DateTimeFormatterdateFormatter){this.dateFormatter=dateFormatter;p}@Osub){尝试{this.dateFormatter.parse(dateStr);}catch(DateTimeParseExceptione){返回false;}返回真;}}编写测试公共类DateValidatorUsingDateTimeFormatterUnitTest{@TestpublicvoidgivenValidator_whenValidDatePassed_ThenTrue(){DateTimeFormatterdateFormatter=DateTimeFormatter.ofPattern("yyyy-MM-dd",Locale.SIMPLIFIED_CHINESE).withResolverStyle(ResolverStyle.STRICT);}DateValidator验证器=newDateValidatorUsingDateTimeFormatter(dateFormatter);assertTrue(validator.isValid("2019-02-28"));}@TestpublicvoidgivenValidator_whenInValidDatePassed_ThenFalse(){DateTimeFormatterdateFormatter=DateTimeFormatter.ofPattern("yyyy-MM-dd",Locale.SIMPLIFIED_CHINESE).withResolverStyle(ResolverStyle);D.ateSTRIdvalator=newDateValidatorUsingDateTimeFormatter(dateFormatter);assertFalse(validator.isValid("2019-02-30"));}}6.使用ApacheCommonsValidatorApacheCommons项目提供了一个验证框架,可以验证日期、时间、数字、货币、IP、Email和URL本文主要看GenericValidator类,它提供了几种验证String是否包含有效日期的方法:publicstaticbooleanisDate(Stringvalue,Localelocale)publicstaticbooleanisDate(Stringvalue,StringdatePattern,booleanstrict)来使用这个库先添加依赖commons-validatorcommons-validator1.6使用GenericValidator类实现日期验证assertTrue(GenericValidator.isDate("2019-02-28","yyyy-MM-dd",true));assertFalse(GenericValidator.isDate("2019-02-29","yyyy-MM-dd",true));7.本文摘要总结了几种验证字符串是否包含有效日期的方法。