如何将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
相关产品推荐
相关产品推荐

