2012-03-26 113 views
2

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

  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"); 
      } 
+1

你可以试试'sdf.setLenient(false)'? – Thilo 2012-03-26 07:25:59

+0

只是做了,它修复了问题 – 2012-03-26 07:27:46

+0

@Thilo是啊..我可以尝试,但它的目的是什么?对不起,新来的Java多数民众赞成在为什么:) – user656523 2012-03-26 07:27:51

回答

4

“03/01211/2012”=> Jun 24 00:00:00 IST 2015 ...为什么?

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

您应该能够关闭这个功能:

sdf.setLenient(false) 

公共无效setLenient(布尔宽松)

指定日期/时间解释是否是宽松的。在宽松的解释下,“1996年2月942”的日期将被视为等同于1996年2月1日之后的第941天。严格的解释,这些日期将引发异常。

+0

谢谢,这有效!+1 :) – user656523 2012-03-26 07:41:38

1

您可以设定严格的格式

SimpleDateFormat.setLenient(false)

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

1

没有看源代码,我假设01211被解析为1211天,并将其添加到2012-03-01,从而导致2015-06-24。正如@Thilo所说sdf.setLenient(false)应该可以帮到这里。

问题是,默认情况下,解析器对输入错误更宽容(默认情况下,lenient模式处于打开状态),因此不会在此引发异常。