【问题标题】:Illegal Argument Exception for setDate in javajava中setDate的非法参数异常
【发布时间】: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。如果您想稍后以另一种格式显示此值,则使用DateTimeFormatterformat 方法将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


【解决方案1】:
LocalDate localDate = LocalDate.now();
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd MMM yyyy");
String formattedString = localDate.format(formatter);
LocalDateTime ldt = LocalDateTime.from(LocalDate.parse(formattedString, formatter).atStartOfDay());
storedProcedureCall.setDate(1, Date.from(ldt.atZone(ZoneId.systemDefault()).toInstant()));

这应该可行。但是,如果您使用使用 java.util.Date 而不是像 LocalDate 这样的新类的标准库,则使用 old java 类会更舒服。

据我了解,您的目标是将当前日期设置为 storedProcedureCall。在 Java 中,任何日期都是 long。在将其转换为字符串之前,不要担心本地和其他功能。所以你可以只用一行来解决你的问题:

storedProcedureCall.setDate(1, new java.util.Date());

P.S. 如何将24 oct 2017 转换为Date 实例并将其设置为storedProcedureCall

storedProcedureCall.setDate(1, new SimpleDateFormat("dd MMM yyyy", Locale.US).parse("24 oct 2017"));

【讨论】:

  • ya 目标是将当前日期设置为 storedProcedureCall,但格式为(“dd MMM yyyy”)。格式是主要目标,否则这很容易使用 java.sql.Date.valueOf(java.time.LocalDate.now())
  • 那么您的示例中有错误,因为java.sql.Date.valueOf() 产生了Date 实例,而不是String。只有在使用 String 时才能谈论日期格式,而不是 Date。如果表格列有Date格式,那么你只需设置Date istance,它不依赖于任何字符串日期格式。
  • 那么我如何在storedProcedureCall.setDate(3,java.sql.Date.valueOf(formattedString))中将我的formattedString(2017年10月24日)字符串类型转换为日期类型;
【解决方案2】:

使用这种格式

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");

你的代码应该是这样的:

    LocalDate localDate = LocalDate.now();
    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
    String formattedString = localDate.format(formatter);
    storedProcedureCall.setDate(1, java.sql.Date.valueOf(formattedString));

【讨论】:

  • 我需要格式为(“dd MMM yyyy”)的日期。目前正在使用您提到的相同代码,但格式除外。
  • 要解析的日期字符串应该是这种格式“yyyy-MM-dd”。为什么需要这种格式?
  • 保存格式更改 setdate 存储过程以获取字符串而不是日期或在存储过程中格式化您的日期
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-02
  • 1970-01-01
相关资源
最近更新 更多