【发布时间】:2017-10-24 05:45:59
【问题描述】:
我有以下代码将 Java LocalDate 转换为特定格式,同时作为 setDate 的参数传递。
LocalDate localDate = LocalDate.now();
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd MMM yyyy");
String formattedString = localDate.format(formatter);
storedProcedureCall.setDate(1, java.sql.Date.valueOf(formattedString));
但是当我在 setDate 的参数中包含 formattedString 时,它总是会抛出 IllegalArgumentException,但是当我这样做时效果很好:
storedProcedureCall.setDate(2, java.sql.Date.valueOf(java.time.LocalDate.now()));
一般:
storedProcedureCall.setDate(2, java.sql.Date.valueOf(java.time.LocalDate.now())); // working
storedProcedureCall.setDate(2, java.sql.Date.valueOf(formattedString)); // not working
【问题讨论】:
-
来自Javadoc:“抛出:
IllegalArgumentException- 如果给定的日期不是 JDBC 日期转义格式 (yyyy-[m]m-[d]d)” -
我对这个问题投了反对票,因为没有任何研究证据。请edit您的问题包括您所做的研究以及准确您遇到困难的地方。如果你能做到这一点,我可能会撤回我的反对票。
-
如果需要保存当前日期,使用
java.sql.Date.valueOf(LocalDate.now())即可。setDate方法将Date作为参数,将日期对象 have no format。如果您想稍后以另一种格式显示此值,则使用DateTimeFormatter的format方法将Date转换为String。 -
我相信你的
storedProcedureCall有一个setObject方法,它直接接受LocalDate,所以你不需要经历过时的java.sql.Date类。请尝试storedProcedureCall.setObject(2, java.time.LocalDate.now(ZoneId.systemDefault()));。它需要一个兼容 JDBC 4.2 的驱动程序,但我相信这些现在很常见。ZoneId.systemDefault()不是绝对必要的,但建议明确说明今天的日期取决于时区,并且您已经有意识地选择了时区。 -
是的,我已经尝试过了,但是我得到了无效的列类型异常。
标签: java java-time localdate date