2011-01-31 9 views
1

現在の日付にCalendarオブジェクトを作成してsql.Dateを作成しようとしています。Grails - java.sql.Dateの不正な引数

def dat = java.sql.Date.valueOf("2011-01-31"); 

しかし、私はコード内の同じ文字列を作成する場合、私は不正な引数エラーを取得しています:これは私が文字列として日付をハードコーディングした場合、すべてのものは結構です、狂気私を運転しています。

がこのスタックトレースを得ている実行
def currentDay = { 

    def today = Calendar.getInstance(); 

    def dateYear = today.get(Calendar.YEAR); 
    def dateMonth = today.get(Calendar.MONTH) + 1; 
    def dateDay =today.get(Calendar.DATE); 

    def todayDate = (dateYear + "-" + dateMonth + "-" + dateDay); 
    def todayDateString = todayDate.toString(); 
    def todayDate2 = java.sql.Date.valueOf(todayDateString); 

    [ today : todayDate2 ] 
} 

java.lang.IllegalArgumentException 
    at java.sql.Date.valueOf(Date.java:138) 
    at java_sql_Date$valueOf.call(Unknown Source) 
    at samma.TapesController$_closure7.doCall(TapesController.groovy:178) 
    at samma.TapesController$_closure7.doCall(TapesController.groovy) 
    at java.lang.Thread.run(Thread.java:619) 

私は完全に愚かな何かをやっている知っているが、私は何ができるか、またどのような回避策を把握することはできません。

ありがとう

ドナルド。

答えて

4

def currentDay = { 

    def todayDate = new java.sql.Date(new Date().time) 
    todayDate.clearTime() 

    [today: todayDate] 
} 
と上記すべてのコードを置き換え
1

文字列に変換する理由は何ですか?ちょうどあなたのCalendarが希望のフィールド値を持っていることを確認し、その後、あなたがちょうどいいようにミリ秒を必要とすることを考えると、また

new java.sql.Date(calendar.getTime().getTime()); 

を呼び出して、私はすべての可能な場合Joda Timeを使用しようとするだろう - それはよカレンダーを操作するよりも簡単です、IMO。あなたはJoda Timeインスタント(または何でも)からlong値に非常に簡単に変換できます。

0

指定された日付がJDBCの日付エスケープ形式(yyyy-mm-dd)でない場合、java.sql.Date.valueOf(String date)はIllegalArgumentExceptionをスローします。提供している日付の形式はyyyy-m-ddです(1〜9の1桁の月のみ)。したがって無効です。

回避策として、SimpleDateFormatを使用して2桁の月を取得するか、Jon Skeetの示唆のように中間の文字列変換を行わずに日付を直接操作します。

関連する問題