2012-03-26 239 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模式處於打開狀態),因此不會在此引發異常。