PreparedStatement中的日期字符串

时间:2011-03-29 06:05:34

标签: java jdbc

我正在尝试在PreparedStatement中使用setDate(),但是我的日期是2008-07-31的格式。代码是:

 pstmt.setDate(f++, (Date) DateFormat.getDateInstance(DateFormat.DEFAULT).parse(value.substring(0, 10)));

然而,它给了我错误:

Exception in thread "main" java.text.ParseException: Unparseable date: "2008-07-31"

为什么会这样?

6 个答案:

答案 0 :(得分:4)

如果您的日期非常具体,请不要让Java使用默认日期格式 - 请自行设置。

例如:

DateFormat parser = new SimpleDateFormat("yyyy-MM-dd");
Date date = parser.parse(value.substring(0, 10));

您还应该设置解析器的时区...我的猜测是UTC是这里最合适的时区。

请注意,这与预准备语句无关 - 它只是 日期解析。

(作为使用DateFormatSimpleDateFormat的替代方法,您可以使用Joda Time,它具有更好的API和线程安全的格式化程序/解析器。您可以让Joda Time转换自它自己的类型为Date值。如果需要它在这里进行解析,可能会有点过分,但如果你正在做任何其他的日期,那么值得深入研究。)

答案 1 :(得分:3)

您需要确保默认的DateFormat是yyyy-MM-dd格式(通常是操作系统中的配置),或者您可以使用SimpleDateFormatjava.sql.Date来解析日期字符串。

java.util.Date d;
SimpleDateFormat sdf = new SimpleDateFormat ("yyyy-MM-dd");
d = sdf.parse ("2008-07-31");

// or
d = java.sql.Date.valueOf ("2008-07-31");

或者,如果底层数据库驱动程序支持VARCHAR / CHARDATE转换,则可以将参数设置为String。

答案 2 :(得分:1)

DateFormat.DEFAULT指向MEDIUM格式,MEDIUM格式看起来像1952年1月12日。因此,您可能使用您正在使用的格式创建SimpleDateFormat对象。

答案 3 :(得分:0)

首先将String转换为Date,然后将其设置为PreparedStatement。请查看以下代码。

SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-mm-dd"); 
Date convertedDate = dateFormat.parse(dateString);

答案 4 :(得分:0)

我认为您提供的日期格式与输入格式不匹配,以及您在格式化时指定的格式在您的情况下是默认格式。

SimpleDateFormat parser = new SimpleDateFormay("yyyy-MM-dd");

尝试对两个日期使用相同的格式。

答案 5 :(得分:0)

我使用

pstmt.setDate(f++, 
              new java.sql.Date(
                  new SimpleDateFormat("yyyy-MM-dd")
                      .parse(value.substring(0, 10))
                      .getTime()
                  )
             );