在使用日期输入时,我们创建了一个我们认为非常错误的值:2017年2月45日或者#34; 2017-02-45"。 这导致在下个月增加了天数,我们以3月的日期结束。 有没有办法廉价地检查日期中的这些不一致? 当前计划是将字符串转换为日期到文本并与原始值进行比较。 接下来是创建Java UDF并使用它来检查和测试格式。
答案 0 :(得分:1)
使用现代java.time类。
使用DateTimeParseException
或LocalDate
通过ResolverStyle.STRICT
解析时引发SMART
。
取决于您正在使用的日期时间类。
现代java.time类使用称为resolver style的三种模式中的任何一种进行解析:
默认STRICT
在解析“2017-02-45”时会抛出java.time.format.DateTimeParseException
。
LocalDate.parse( "2017-02-45" )
java.time.format.DateTimeParseException:无法解析文本'2017-02-45':DayOfMonth的值无效(有效值1 - 28/31):45
同上SMART
,抛出异常。
只有LENIENT
接受错误的输入并进行调整。
输入:2017-02-45
输出:2017-03-17
请参阅this live code example in IdeOne.com我们尝试三种模式中的每一种。
String input = "2017-02-45" ;
System.out.println( "input: " + input ) ;
for( ResolverStyle rs : ResolverStyle.values() )
{
try{
System.out.println( "---------------" ) ;
System.out.println( "Parsing with ResolverStyle: " + rs ) ;
DateTimeFormatter f = DateTimeFormatter.ISO_LOCAL_DATE.withResolverStyle( rs ) ;
LocalDate ld = LocalDate.parse( input , f ) ;
System.out.println( "ld.toString(): " + ld ) ;
} catch ( DateTimeParseException e ) {
System.out.println( "Caught exception for ResolverStyle: " + rs ) ;
}
}
input: 2017-02-45
---------------
Parsing with ResolverStyle: STRICT
Caught exception for ResolverStyle: STRICT
---------------
Parsing with ResolverStyle: SMART
Caught exception for ResolverStyle: SMART
---------------
Parsing with ResolverStyle: LENIENT
ld.toString(): 2017-03-17