解析日期不正确

时间:2012-03-26 07:21:10

标签: java validation parsing date

我尝试将输入日期字符串转换为日期格式,然后转换为日期时间格式。 作为测试,我给出了一个不正确的日期格式的输入,但这似乎没有抛出任何解析异常并给我错误的输出。我对下面的代码做错了什么想法?

            String OLD_FORMAT ="MM/dd/yyyy";
            String NEW_FORMAT ="yyyyMMdd HHmmss";
            SimpleDateFormat sdf = new SimpleDateFormat(OLD_FORMAT);
            String oldDateString = "03/01211/2012"; //Incorrect input
            Date myOldDate;
            Datetime myNewDate;
            try {
                myOldoldDate = sdf.parse(oldDateString); 
           //Returns Wed Jun 24 00:00:00 IST 2015...why?? 
          //Shouldn't this be throwing a parse exception?
            } catch (ParseException e) {
                logger.error("Error while parsing Date");
            }
            sdf.applyPattern(NEW_FORMAT);
            //Converting date to datetime format
            try {
                myNewDate= DateHelper.toDatetime(sdf.parse((sdf.format(myOldDate)))); 
           //Returns 2015-06-24 00:00:00.0
            } catch (ParseException e) {
                logger.error("Error while parsing Date");
            }

3 个答案:

答案 0 :(得分:4)

“03/01211/2012”=> 2015年6月24日00:00:00 IST?为什么?

我的猜测是,2015年6月24日是2012年3月1日起的1211天。 过度翻转,将其读作3月12日。

您应该可以通过以下方式关闭此功能:

sdf.setLenient(false)
  

public void setLenient(boolean lenient)

     

指定日期/时间解释是否宽松。通过宽松的解释,诸如“1996年2月942”之类的日期将被视为等同于1996年2月1日之后的第941天。通过严格的解释,这些日期将导致例外被抛出。

答案 1 :(得分:1)

您可以设置严格格式

SimpleDateFormat.setLenient(false)

指定日期/时间解析是否宽松。通过宽松解析,解析器可以使用启发式来解释与该对象的格式不精确匹配的输入。通过严格的解析,输入必须与此对象的格式匹配。

答案 2 :(得分:1)

在不查看源代码的情况下,我假设01211被解析为1211天,这些日期被添加到2012-03-01,从而导致2015-06-24。正如@Thilo所说sdf.setLenient(false)应该在这里提供帮助。

问题在于,默认情况下,解析器更容忍错误的输入(默认情况下,宽松模式处于启用状态),因此不会在此处引发异常。