防止日期转换溢出

时间:2017-10-10 19:22:52

标签: java hive hiveql

在使用日期输入时,我们创建了一个我们认为非常错误的值:2017年2月45日或者#34; 2017-02-45"。 这导致在下个月增加了天数,我们以3月的日期结束。 有没有办法廉价地检查日期中的这些不一致? 当前计划是将字符串转换为日期到文本并与原始值进行比较。 接下来是创建Java UDF并使用它来检查和测试格式。

1 个答案:

答案 0 :(得分:1)

TL;博士

使用现代java.time类。

使用DateTimeParseExceptionLocalDate通过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