Java使用SimpleDateFormat转换ResultSet日期格式报错咨询
问题根因
你的代码存在5个核心问题,直接导致编译失败+转换逻辑不生效:
- 方法调用参数不匹配:定义的
Utils.Format方法要求传入2个入参(格式字符串、Date类型对象),实际调用时只传了1个rs.getString("Date"),这是编译报错的直接原因。 - Utils方法逻辑完全无效:方法内部不管传入什么参数,都会直接执行
date = new Date()取当前系统时间做格式化,完全没有处理你要转换的目标日期值,且定义的formato入参全程没有被使用,输出格式是硬编码的,就算编译通过也永远返回当前时间的格式化结果,和你要转换的数据库日期无关。 - 日期转换链路缺失:你从ResultSet拿到的是
dd/MM/yyyy HH:mm:ss格式的字符串,没有先把这个字符串解析为Date类型的步骤,无法直接转成其他格式的日期字符串。 - 语法错误:调用
Utils.Format时传入的rs.getString("Date"缺少右括号,语法不合法。 - 实体类命名不规范:Java字段名遵循小驼峰规则,你把字段命名为
Date首字母大写,容易和getter/setter生成规则、框架反射逻辑冲突。
可直接运行的修正代码
1. 修正Utils工具类
实现逻辑:先按源格式把字符串解析为Date对象,再按目标格式输出字符串,同时兼容日期字符串前后空格、中间多空格的情况。
import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; public class Utils { /** * 将dd/MM/yyyy HH:mm:ss格式的日期字符串转换为yyyyMMddHHmmss格式 * @param sourceDateStr 源格式日期字符串,例如19/06/2022 00:00:10 * @return 转换后的14位日期字符串,例如20220619000010 * @throws ParseException 日期格式不匹配时抛出解析异常 */ public static String format(String sourceDateStr) throws ParseException { // 定义源日期格式,匹配数据库返回的日期结构 SimpleDateFormat sourceSdf = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss"); // 关闭宽松解析,避免非法日期被自动转换导致结果错误 sourceSdf.setLenient(false); // 先去除字符串前后空格,再解析为Date对象 Date date = sourceSdf.parse(sourceDateStr.trim()); // 定义目标输出格式 SimpleDateFormat targetSdf = new SimpleDateFormat("yyyyMMddHHmmss"); // 格式化为目标字符串返回 return targetSdf.format(date); } }
2. 修正MyFile实体类
遵循Java小驼峰命名规范,补全getter/setter:
public class MyFile { private String date; public String getDate() { return date; } public void setDate(String date) { this.date = date; } }
3. 修正结果集封装方法
补全语法错误,适配修正后的工具方法,抛出对应异常:
import java.sql.ResultSet; import java.sql.SQLException; import java.text.ParseException; public class RowMapper { public static MyFile createRow (ResultSet rs) throws SQLException, ParseException { MyFile mf = new MyFile(); mf.setDate(Utils.format(rs.getString("Date"))); return mf; } }
优化建议
- 如果数据库中
Date字段本身是日期时间类型(DATETIME、TIMESTAMP),不要用rs.getString()取值,直接用rs.getTimestamp("Date")拿到时间对象,省去字符串解析步骤,性能更好也不会出现格式匹配问题。可以在Utils里重载一个接收Date类型参数的方法简化调用:
public static String format(Date date) { SimpleDateFormat targetSdf = new SimpleDateFormat("yyyyMMddHHmmss"); return targetSdf.format(date); }
调用时直接写mf.setDate(Utils.format(rs.getTimestamp("Date")));即可,不需要额外处理ParseException。
SimpleDateFormat是线程不安全的,如果是多线程并发场景,不要把它定义为静态共享变量,建议每次调用时新建实例,或者使用Java 8+自带的DateTimeFormatter代替,线程安全更可靠。
内容的提问来源于stack exchange,提问作者Manuj0
相关产品推荐
相关产品推荐

