我正在尝试在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"
为什么会这样?
答案 0 :(得分:4)
如果您的日期非常具体,请不要让Java使用默认日期格式 - 请自行设置。
例如:
DateFormat parser = new SimpleDateFormat("yyyy-MM-dd");
Date date = parser.parse(value.substring(0, 10));
您还应该设置解析器的时区...我的猜测是UTC是这里最合适的时区。
请注意,这与预准备语句无关 - 它只是 日期解析。
(作为使用DateFormat
和SimpleDateFormat
的替代方法,您可以使用Joda Time,它具有更好的API和线程安全的格式化程序/解析器。您可以让Joda Time转换自它自己的类型为Date
值。如果只需要它在这里进行解析,可能会有点过分,但如果你正在做任何其他的日期,那么值得深入研究。)
答案 1 :(得分:3)
您需要确保默认的DateFormat是yyyy-MM-dd
格式(通常是操作系统中的配置),或者您可以使用SimpleDateFormat
或java.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
/ CHAR
到DATE
转换,则可以将参数设置为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()
)
);