2016-04-26 16 views
0

sql.dateに文字列を解析する際に問題が発生しました このコードは初めてプロジェクトでのみ動作しますが、通常は日付が正常に解析されますが、例外。例外が発生する例外:文字列をjava.sql.dateに変換

私は関数が受け取る日付を表示しました。これは同じフォーマットです。たとえば、02.02.2016はokeyでした。月は02.04.2016に変更され、例外が発生しました。

private final SimpleDateFormat dateFormat = new SimpleDateFormat("dd.mm.yyyy"); 
private final String sqldateFormat = "yyyy-mm-dd"; 

public java.sql.Date changeDate(String date) {  
    String newDate = ""; 
    try { 
     java.util.Date d = dateFormat.parse(date); 
     dateFormat.applyPattern(sqldateFormat); 
     newDate = dateFormat.format(d); 

    } catch (ParseException e) { 
     e.printStackTrace(); 
    }     

    return java.sql.Date.valueOf(newDate); 
} 
+1

コメントはありません(コメントにはありません) –

+3

文字列から文字列に 'java.util.Date'に移動し、' java.sql.Date'に移動するのはなぜですか? 'java.util.Date'の時刻値から' java.sql.Date'を作成することができます。 –

+0

**フィールド** 'dateFormat'で' applyPattern'を使うとどうなるか考えてください:あなたは 'dateFormat'を変更していますので、その後の' changeDate'の呼び出しは失敗します。 –

答えて

2

あなたがSimpleDateFormatのパターンを変更しているファースト・実行中に、第2日付を解析することができなくなりますので、この

private final SimpleDateFormat dateFormat = new SimpleDateFormat("dd.mm.yyyy"); 
private final SimpleDateFormat sqldateFormat = new SimpleDateFormat("yyyy-mm-dd"); 

public java.sql.Date changeDate(String date) {  
    String newDate = ""; 
    try { 
     java.util.Date d = dateFormat.parse(date); 
     newDate = sqldateFormat.format(d); 
    } catch (ParseException e) { 
     e.printStackTrace(); 
    }     
    return java.sql.Date.valueOf(newDate); 
} 

を試してみてください。

dateFormat.applyPattern(sqldateFormat);は、パターンを"yyyy-mm-dd"に変更してから、02.04.2016を解析すると例外がスローされます。

0

dateFormatのパターンが変更されたためです。 これは動作します:

private final SimpleDateFormat dateFormat = new SimpleDateFormat("dd.mm.yyyy"); 
private final SimpleDateFormat sqlFormat = new SimpleDateFormat("yyyy-mm-dd"); 

public java.sql.Date changeDate(String date) { 
    String newDate = ""; 
    try { 
     java.util.Date d = dateFormat.parse(date); 
     newDate = sqlFormat.format(d); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

    return java.sql.Date.valueOf(newDate); 
} 
0

どうやら、これは最初の実行のためにではなく、第二のために動作します。あなたの問題は、applyPattern()と呼ぶことです。そのため、新しい日付はSQLの日付形式でしか期待されません。ここで

は少し良くコードです:

private final SimpleDateFormat dateFormat = new SimpleDateFormat("dd.mm.yyyy"); 
private final SimpleDateFormat sqlFormat = new SimpleDateFormat("yyyy-mm-dd"); 

    public java.sql.Date changeDate(String date) {  

    String newDate = ""; 
    try { 
     java.util.Date d = dateFormat.parse(date); 
     newDate = sqlFormat.format(d); 

    } catch (ParseException e) { 
     e.printStackTrace(); 
    }     

    return java.sql.Date.valueOf(newDate); 
} 
0

valueOf()を使用しないでください。あなたはjava.util.Dateを持っているとしたい場合

java.sql.Date(またはjava.sql.Timestamp)、Date(long date)のコンストラクタを使用します。

java.sql.Date sqlDate = new java.sql.Date(utilDate.getTime()); 

また、はないキャッチ例外を行い、それを処理せずに実行を継続する(それをされていない印刷それを扱う)。

private final SimpleDateFormat dateFormat = new SimpleDateFormat("dd.mm.yyyy"); 

public java.sql.Date changeDate(String date) { 
    try { 
     return new java.sql.Date(dateFormat.parse(date).getTime()); 
    } catch (ParseException e) { 
     throw new IllegalArgumentException("Invalid date: " + date); 
    } 
} 

警告:あなたのコードがなければならないことを意味

SimpleDateFormatはスレッドセーフではありません。

日付フォーマットは同期されません。スレッドごとに個別の書式インスタンスを作成することをお勧めします。複数のスレッドが同時にフォーマットにアクセスする場合は、外部と同期させる必要があります。

関連する問題