2011-07-11 14 views
4

私は、文字列を解析して日付オブジェクトにする「シンプルな」方法を理解しようとしています。あいまいなStringをDateに解析する方法は?

文字列は、yyyyMMdd、yyyyMMddHHmmまたはyyyyMMddHHmmSSのいずれかです。

現在、私はStringの長さを見て、長さに応じてDateParserを作成しています。これを行うよりエレガントな方法はありますか?

+5

類似の質問http://stackoverflow.com/questions/5897288/optional-parts-in-simpledateformat –

答えて

6

それともできパッドあなたの文字列を:

SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmSS") { 
    @Override 
    public Date parse(String s) throws ParseException { 
    return super.parse((s + "000000").substring(0, 14)); 
    } 
}; 

System.out.println(sdf.format(sdf.parse("20110711182405"))); 
System.out.println(sdf.format(sdf.parse("201107111824"))); 
System.out.println(sdf.format(sdf.parse("20110711"))); 
+0

+1元のソリューション:) –

2

私はSimpleDateFormatクラスを使用し、文字列の長さに基づいてフォーマットパターンを設定します。あなたがいつか同じ長さの文字列を持っていなければ、それはうまくいくでしょう。 2011年7月11日

フォーマット:あなたの質問からの例を使用して

SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd"); 
Date parsedDate = dateFormat.parse("20110711"); 

フォーマット2011年7月11日1340hrs:

dateFormat = new SimpleDateFormat("yyyyMMddHHmm"); 
parsedDate = dateFormat.parse("201107111340"); 

は、2011年7月11日1340hrs 10秒の書式を設定します(NB。秒は小、Sはミリ秒です)

dateFormat = new SimpleDateFormat("yyyyMMddHHmmss"); 
parsedDate = dateFormat.parse("20110711134010"); 

フォーマットパターン文字の完全なリストについては、ハイパーリンクを参照してください。

+1

例を挙げてください。コードはどのように見えますか? '新しいSimpleDateFormat(" YYYYMMDD ")'または '新しいSimpleDateFormat(" YYYYMMDDHHMMSS ")? – iliaden

+1

また、あなたのリンクは古い文書を指しています。 –

+0

申し訳ありません、リンクが更新されました。 – razlebe

-1

DateFormatterを使用すると、文字列から日付を解析できます。

import java.util.*; 
import java.text.*; 

public class StringToDate 
{ 
public static void main(String[] args) 
{ 
try 
{ 
    String str_date="11-June-07"; 
    DateFormat formatter ; 
    Date date ; 
    formatter = new SimpleDateFormat("yyyy-MM-dd"); 
    date = (Date)formatter.parse(str_date); 

    } 
    catch (ParseException e) 
    { 
    System.out.println("Exception :"+e); 
    } 
} 
} 

必要に応じてパターンを変更できます。

+2

はい。しかし、私の場合、私は3つの別のDateFormattersが動作するまでそれらの1つが必要です... – iliaden

4

文字列の長さを見て、適切なSimpleDateFormatインスタンスを作成します。

SimpleDateFormat getFormatFor(String dateString){ 
    if (dateString.length() == 8 ) return new SimpleDateFormat("yyyyMMdd"); 
    if (dateString.length() == 14) return new SimpleDateFormat("yyyyMMddHHmmss"); 
    // you got a bad input... 
} 

NBこれらはスレッドセーフではないため、毎回新しいスレッドを作成する必要があります。

0

あなたはまだ(あなたが示唆したように)、「専門的な」パーサーを使用し、それらをチェーンできます。たとえば 、あなたはまだ(yyyyMMddHHmmSS用)DateHourMinSecParserを持つことができ、DateHourMinParseryyyyMMddHHmm用)とDateParseryyyyMMdd用)すべてそれらのうち同じインターフェースを実装する:

public interface GenericDateParser { 
Date parseDate(String input) throws IllegalArgumentException; 
} 

public class DateHourMinSecParser implements GenericDateParser { 
... 
    public Date parseDate(String input) throws IllegalArgumentException { 
    ... 
    } 
} 

が、これらのクラスのそれぞれ一つは、実際のパラメータ別GenericDateParserかかるだろう - 例えば - パース(またはいくつかの内部チェック場合は、各パーサは、日付そのものを解析する最初しようとするだろうということで考えを文字列の長さ)が失敗した場合、チェーン内のパーサーがなくなるまで(それは例外をスローするか、チェーン内のメンバーの1つが値を返すまで)、チェーン内の次のパーサーに渡します。

public class DateHourMinSecParser implements GenericDateParser { 
    private GenericDateParser chained; 

    public DateHourMinSecParser(GenericDateParser chained) { 
     this.chained = chained; 
    } 

    public Date parseDate(String input) throws IllegalArgumentException { 
     if(!internalChecks()) { //chain it up 
     if(chained == null) throw new IllegalArgumentException("Don't know how to parse " + input); 
     } 
     //internal checks passed so try to parse it and return a Date or throw exception 
     ... 
    } 
} 

、あなたがそれらを初期化します:

GenericDateParser p = new DateHourMinSecParser(new DateHourMinParser(new DateParser(null))); 

してからちょうどトップレベルのいずれかを使用します。ゼロで

Date d = p.parse('20110126'); 
関連する問題