You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将JSpinner组件的日期正确插入Oracle数据库?

解决JSpinner日期插入Oracle数据库的格式问题

我来帮你搞定这个问题,你遇到的Unparseable date异常和后续可能丢失时间的问题,主要出在这几个地方:

核心问题分析

  • JSpinner值的处理错误:你把jSpinner1.getValue()直接转成字符串,这个默认的toString()输出格式(比如Wed Jan 01 09:30:00 CST 2018)和你指定的SimpleDateFormat格式完全不匹配,这直接导致了解析异常。
  • 错误的日期类型选择:java.sql.Date只存储日期部分(年、月、日),会丢失时分秒信息,而你的Oracle表字段是带时间的(比如2018-01-01 09:30:00.0),应该用java.sql.Timestamp来保存完整的日期时间。
  • 格式字符串错误:你用的"yyyy-MM-dd hh-mm-ss a"里,时间分隔符是减号(-)而不是Oracle需要的冒号(:),而且hh是12小时制,搭配a(上午/下午),但你的目标格式是24小时制的时间,应该用HH代替hh,并且不需要a。

修正后的代码实现

首先,确保你的JSpinner使用的是DateSpinnerModel(这样getValue()直接返回java.util.Date对象,不需要转字符串解析),然后用以下代码插入:

// 直接获取JSpinner的Date对象,避免字符串转换的格式问题
java.util.Date selectedDate = (java.util.Date) jSpinner1.getValue();

// 转换为能保存完整时间的java.sql.Timestamp
java.sql.Timestamp sqlTimestamp = new java.sql.Timestamp(selectedDate.getTime());

String Query = "Insert into RoomTable Values( ?, ?, ?)";
PreparedStatement stmt = conn.prepareStatement(Query);

// 设置Timestamp到参数(Oracle的DATE/TIMESTAMP字段对应setTimestamp)
stmt.setTimestamp(2, sqlTimestamp);

// 执行插入操作
stmt.executeUpdate();
stmt.close();

额外注意事项

  • 如果你的Oracle表字段类型是DATE,它本身就支持存储时分秒(很多人误以为Oracle DATE只存日期,其实不是),用setTimestamp完全没问题;如果是TIMESTAMP类型,同样适用。
  • 不要手动把Date转成字符串再解析,直接用Date对象转SQL类型是最可靠的,避免任何格式不匹配的风险。
  • 如果你必须用字符串解析的方式(不推荐),要先给JSpinner设置自定义的DateEditor统一输出格式:
    JSpinner.DateEditor editor = new JSpinner.DateEditor(jSpinner1, "yyyy-MM-dd HH:mm:ss");
    jSpinner1.setEditor(editor);
    
    这样jSpinner1.getValue().toString()的格式就和你需要的一致了,但还是不如直接用Date对象高效可靠。

内容的提问来源于stack exchange,提问作者Saloni Mude

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:50:29