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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 13:36:21