2012-02-28 11 views
3

私はStringのように見えるDateを持っており、それを解析したい。
しかし、日付は多くのパターンの1つのように見えます。parse joda-time

MM/dd/yy 

又は

HH:mm 

又は

MM/dd/yy HH:mm 

又は

MM/dd/yy HHmm 

Iは多くのパターン

を解析することができるコードを有します
public DateTime parseDateTime(final String text) 
    { 
     if (StringUtils.isEmpty(text)) return null; 
     int field = 0; 
     DateTime dateTime = null; 
     IllegalArgumentException exception = null; 
     for (; field < FIELD_COUNT; ++field) 
     { 
     if (null != formatters[field]) 
     { 
      try 
      { 
       dateTime = formatters[field].parseDateTime(text); 
       break; 
      } 
      catch (final IllegalArgumentException e) 
      { 
       exception = null != exception ? exception : e; 
      } 
     } 
     } 
     if (dateTime == null) 
     { 
     throw exception; 
     } 
     return dateTime; 
    } 

formatters[]

DateTimeFormatter 

の配列は、あなたが別の方法を提案することができるのですか?よりシンプルに

+0

グーグルが私に[POJava](http://www.pojava.org)と呼ばれるライブラリを伝えるには、ヒューリスティック日付/時刻のパーサーが含まれています。 org/site/pojava-2.8.0/apidocs/org/pojava/datetime/DateTime.htmlを参照してください。これを行う別のライブラリはPythonの[dateutil](http://labix.org/python-dateutil)ですが、明らかにその努力に値するものではないかもしれないものを移植する必要があります。 – millimoose

+0

あなたのアプローチは読みやすく保守的です。あなたの初期設定を 'フォーマット'すると、どのパターンがサポートされているかを一目でわかります。他のコードを変更せずにパターンを追加したり削除したりすることができます。あなたが今持っているものと比べて、より単純な選択肢を比較することは価値があるでしょう。 –

答えて

0

最初のパターンにはスペースとコロンが含まれていません。

第2のものにはコロンが含まれますが、スペースは含まれません。

3番目にはスペースとコロンが含まれています。

最後に空白が含まれていますが、コロンは使用できません。

したがって、2つのコールを使用すると、適用するパターンを決定できるはずです。

もう1つの方法は、すべてのパターン(8,5,14、および13)で異なる文字列の長さを使用することです。

+0

良いアイデアですが、単純ではありません。 joda-APIにはすでに多くのパターンを使用したメソッドが含まれていたと私は期待していました。 – Ilya

0

SimpleDateFormatクラスは、指定した任意の文字列形式の日付を解析できます。すべてのフォーマットフィールドが解析されている場合、解析は、末尾の文字を無視することができますので、フォーマット規則については、例えばjavadoc

を参照してください、

try 
    { 
     DateFormat df = new SimpleDateFormat("MM/dd/yy HHmm"); 
     Date date = df.parse("03/29/12 2359"); 
     System.out.println(date); 
    } 
    catch (ParseException e) 
    { 
     e.printStackTrace(); 
    } 

、/最短と最長/最も複雑なものと終わりで始まります最も単純なもの。例外をスローしない最初のものを取る。あなたのケースでは

ます:http://www.pojava

{ 
new SimpleDateFormat("MM/dd/yy HH:mm"), 
new SimpleDateFormat("MM/dd/yy HHmm"), 
new SimpleDateFormat("MM/dd/yy"), 
new SimpleDateFormat("HH:mm") 
}