2012-03-26 20 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

+0

ちょっとして問題を解決しました –

+0

@Thiloええ。私はそれを試みることができますが、その目的は何ですか?申し訳ありません、Javaの新しい理由that :) – user656523

答えて

4

「03/012/11/2012」=> 6月24日00:00:00 IST 2015 ...なぜですか?

私の推測では、2015年6月24日は2012年3月1日から1211日です。 過度のロールオーバーは3月1211日と読んでいます。

あなたはでこれをオフにすることができるはずです。

sdf.setLenient(false) 

ます。public void setLenient(boolean型寛大)

は、日付/時刻の解釈を厳密に行うかどうかを指定します。寛大な解釈では、「1996年2月942日」のような日付は、1996年2月1日以降の941日に相当するものとして扱われます。厳密な解釈では、このような日付は例外をスローします。

+0

ありがとう、それは働く!+1 :) – user656523

1

あなたは、日付/時刻の解析を厳密に行うかどうかを指定します

SimpleDateFormat.setLenient(false)

厳格な形式を設定することができます。敏感な解析では、パーサーはヒューリスティックを使用して、このオブジェクトの形式と正確に一致しない入力を解釈することがあります。厳密な解析では、入力はこのオブジェクトの形式と一致する必要があります。

1

ソースコードを見ることなく、01211は1211日に解析され、2012-03-01に追加され、2015-06-24となります。 @ Thiloはsdf.setLenient(false)がここで助けてくれると言いました。

デフォルトでは、パーサーは間違った入力に対してより寛容です(デフォルトでは寛容モードがオン)ので、ここでは例外がスローされません。

関連する問題