2011-12-19 15 views
0

ユーザーが日付を間違った形式で入力すると、NULLポインタ例外が発生します。文字列を日付に変換 - 日付検証

Date stringToDate(String dateString) { 

     Date returnDate = null; 
     if (dateString!= null && dateString.length() > 0 && isValidDate(dateString)) { 
      returnDate = dateFormat.parse(dateStr); 
     } 
     return returnDate; 
    } 

boolean isValidDate(String date) { 
    SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy"); 
    Pattern datePattern = Pattern.compile("[0-9]{2}/[0-9]{2}/[0-9]{4}"); 
    Matcher datePatternMatch = datePattern.matcher(date); 

    boolean datePatternMatchfound = datePatternMatch.matches(); 

    if(date==null){ 
     return false; 
    } else if(date!=null && date.length()>0){  
     if(datePatternMatchfound){ 
      sdf.setLenient(false); 
      sdf.parse(date.trim()); 
     } 
     return true; 
    } else { 
     return false; 
    } 
} 

を文字列を日付に変換する

方法私は....

1を知っているだけで好奇心)の日付のための有効なパターンがどうあるべきか?

2)ユーザーが誤った日付を入力した場合、stringToDateメソッドは確実に失敗し、NULLポインタ例外をスローします。それを避ける方法は?

本当にありがとうございます。

+0

あなたの質問履歴に基づいてJSFを使用しています。 JSF入力フィールドにこれを実際に使用している場合、これは完全に間違っています。 – BalusC

答えて

2

あなたが

0
  1. 有効なパターンの形式は、たとえばシステムの国の設定によって異なります。

  2. 例外を回避するために、isValidDate()メソッドの内容をtry-catchブロックに入れる必要があります。

1

正しい日付表示形式は、アプリケーションとユーザーのロケールによって異なります。ただし、入力形式を特定の形式に制限し、日付入力の解析と書式設定に使用できます。

parseメソッドによってスローされたParseExceptionをキャッチし、catch句内の無効なケースを処理できます。

SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy"); 

Date stringToDate(String dateString) { 
    try { 
    Date returnDate = sdf.parse(dateString); 
    // do something with returnDate, if necessary 
    return returnDate; 
    } catch(ParseException e) { 
    // Date is not valid, handle invalid cases here.. 
    return null; // Not a good practice, you probably would throw an Exception 
    } 
} 

そして、あなたはsdf.format(someDate)メソッドを呼び出して、文字列表現を取得することにより、ユーザー・インターフェースに値を表示するには、同じフォーマッタを使用することができます。

例えば、あなたのコードは次のように簡略化することができます。

+0

パターンマッチング条件を削除してもユーザーがランダムな数値を入力しても解析に問題があります。日付形式は "MM/dd/yyyy"で定義されています –

+0

答えをダッシュ​​の代わりにスラッシュで変更しました。 – melihcelik

1
を受け入れるように)あなたのユーザーはのSimpleDateFormatにのみ入力することができ、またはあなたがisValidDate(に変更を加える必要があることを確認する必要がありどちらか、ユーザが入力するデフォルトのパターンをMM-ddは-yyyyas(てSimpleDateFormatを想定しています

一つは、あなたの検証方法では、より防御的である必要があることである

あなたが示されているコードでは、あなたがこれを行う:。

Matcher datePatternMatch = datePattern.matcher(date); 

日付文字列がnullであるかどうかを確認する前にPattern.matcher(null)結果。 NullPointでerException。

したがって、if (date != null)条件ブロック内でこのコードを移動する必要があります。

それとは別に、正規表現で日付文字列を検証してから、DateFormatを使用してそれを検証する利点はありません。正規表現の検証では、追加の利点はありません。

0

Simple date formatクラスを使用すると、stringが日付かどうかを検証できます。 setLenient(false)をsimple date formatオブジェクトに設定する必要があります。

それはあなたがvalues.For例を丸めて問題に終わるされている設定されていないなら、寛大GregorianCalendarをMONTH == 1月、DAY_OF_MONTH == 32

2月1と例のコード解釈:

http://www.vijayakumarg.co.in/2014/04/how-to-validate-date-string-in-java.html

public static boolean validateJavaDate(String strDate) 
{ 

    /* 
    * Set preferred date format, 
    * For example MM-dd-yyyy, MM.dd.yyyy,dd.MM.yyyy etc.*/ 
    SimpleDateFormat sdfrmt = new SimpleDateFormat("MM/dd/yyyy"); 
    sdfrmt.setLenient(false); 
    /* Create Date object */ 
    Date javaDate = null; 
    /* parse the string into date form */ 
    try 
    { 
     javaDate = sdfrmt.parse(strDate); 
     System.out.println("Date after validation: " + javaDate); 
    } 
    /* Date format is invalid */ 
    catch (ParseException e) 
    { 
     System.out.println("The date you provided is in an " +"invalid date format."); 
     return false; 
    } 
    /* Return 'true' - since date is in valid format */ 
    return true; 

} 
関連する問題