私は、文字列を解析して日付オブジェクトにする「シンプルな」方法を理解しようとしています。あいまいなStringをDateに解析する方法は?
文字列は、yyyyMMdd、yyyyMMddHHmmまたはyyyyMMddHHmmSSのいずれかです。
現在、私はStringの長さを見て、長さに応じてDateParserを作成しています。これを行うよりエレガントな方法はありますか?
私は、文字列を解析して日付オブジェクトにする「シンプルな」方法を理解しようとしています。あいまいなStringをDateに解析する方法は?
文字列は、yyyyMMdd、yyyyMMddHHmmまたはyyyyMMddHHmmSSのいずれかです。
現在、私はStringの長さを見て、長さに応じてDateParserを作成しています。これを行うよりエレガントな方法はありますか?
それともできパッドあなたの文字列を:
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")));
+1元のソリューション:) –
私は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");
フォーマットパターン文字の完全なリストについては、ハイパーリンクを参照してください。
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);
}
}
}
必要に応じてパターンを変更できます。
はい。しかし、私の場合、私は3つの別のDateFormattersが動作するまでそれらの1つが必要です... – iliaden
文字列の長さを見て、適切な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これらはスレッドセーフではないため、毎回新しいスレッドを作成する必要があります。
あなたはまだ(あなたが示唆したように)、「専門的な」パーサーを使用し、それらをチェーンできます。たとえば 、あなたはまだ(yyyyMMddHHmmSS
用)DateHourMinSecParser
を持つことができ、DateHourMinParser
(yyyyMMddHHmm
用)とDateParser
(yyyyMMdd
用)すべてそれらのうち同じインターフェースを実装する:
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');
類似の質問http://stackoverflow.com/questions/5897288/optional-parts-in-simpledateformat –