Grails - java.sql.Date的非法参数

时间:2011-01-31 21:51:05

标签: grails groovy

我正在尝试通过在当前日期创建一个Calendar对象来创建一个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)

我知道我做的事情完全是愚蠢的,但我无法弄清楚是什么,也不知道解决方法是什么。

谢谢

唐纳德。

3 个答案:

答案 0 :(得分:4)

替换上面的所有代码
def currentDay  = {

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

    [today: todayDate]
}

答案 1 :(得分:1)

为什么要转换为字符串?只需确保您的Calendar包含所需的字段值,然后调用

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

或者,鉴于你只需要毫无道理,我会尝试尽可能使用Joda Time - 它比操作日历,IMO更容易。您可以非常轻松地从Joda Time instant(或其他)转换为long值。

答案 2 :(得分:0)

如果给定的日期不是JDBC日期转义格式(yyyy-mm-dd),则

java.sql.Date.valueOf(String date)会抛出IllegalArgumentException。您提供的日期格式为yyyy-m-dd(1-9只有一个月的数字),因此无效。

作为一种解决方法,使用SimpleDateFormat获取两个月的月份或直接使用日期而不使用Jon Skeet建议的中间字符串转换。