2011-07-14 4 views
1

これは、私がJavaで私のisDateとして使用しているものです。私はWHAT??????は毎回印刷しますJavaが有効な日付であることを伝える理由は何ですか?

String fromDate = ""; 

if (Common.isDate(fromDate)) { 
    System.out.println("WHAT??????"); 
} 

public class Common { 
    public static final String DATE_PATTERN = "yyyy-MM-dd"; 

    public static boolean isDate(String text) { 
     return isDate(text, DATE_PATTERN); 
    } 

    public static boolean isDate(String text, String date_pattern) { 
     String newDate = text.replace("T00:00:00", ""); 
     SimpleDateFormat formatter = new SimpleDateFormat(date_pattern); 
     ParsePosition position = new ParsePosition(0); 
     formatter.parse(newDate, position); 
     formatter.setLenient(false); 
     if (position.getIndex() != newDate.length()) { 
      return false; 
     } else { 
      return true; 
     } 
    } 
} 

は、ここに私のテストコードです。私はここで何が欠けていますか?

ありがとうございました。

+0

は 'position.getErrorIndex(でテストしてみてください)= - ! 1 'となる。 http://download.oracle.com/javase/1.4.2/docs/api/java/text/ParsePosition.html#getErrorIndex%28%29 – JAB

答えて

2

成功した解析をチェックする正しい方法は、parseメソッドがDateまたはnullを返すかどうかを確認することです。これを試してみてください:

public static boolean isDate(String text, String date_pattern) { 
    String newDate = text.replace("T00:00:00", ""); 
    SimpleDateFormat formatter = new SimpleDateFormat(date_pattern); 
    ParsePosition position = new ParsePosition(0); 
    formatter.setLenient(false); 
    return formatter.parse(newDate, position) != null; 
} 
+0

これは素晴らしい機能でした!ありがとう – cbmeeks

+1

これは、 "2003-03-01sdfsdf"のような日付でもtrueを返すことに注意してください(最初の行で置き換えを行わないと仮定した場合) – Kal

+0

良い点。現在のところ、これは1つの種類の日付のみを受け入れる1つの場所で使用されます(これが「T00 ...」を削除する理由です)。 – cbmeeks

6

ロジックが正しくないためです。 newDate=""、すなわちnewDate.length()==0。文字列の最初の部分でエラーが発生しているため、position.getIndex()==0と同様です。 position.getErrorIndex()>=0かどうかをテストすることができます。

+0

+1 - これが実際の問題です。 – CoolBeans

+0

説明していただきありがとうございます – cbmeeks

0

車輪の再発明をしないでください... Joda Timeを使用します。)

DateTimeFormatter fmt = DateTimeFormat.forPattern("yyyy-MM-dd"); 
    try { 
     DateTime dt = fmt.parseDateTime("blub235asde"); 
    } catch (IllegalArgumentException e) { 
     e.printStackTrace(); 
     return false; 
    } 
    return true; 

出力:

java.lang.IllegalArgumentException: Invalid format: "blub235asde" 
    at org.joda.time.format.DateTimeFormatter.parseDateTime(DateTimeFormatter.java:673) 
    at Test.main(Test.java:21) 
関連する問題