You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Java Timestamp转换MySQL 8.26时间格式报错排查及java.sql.Timestamp是否过时咨询

问题分析与解决

首先明确:java.sql.Timestamp类并没有过时,你的报错问题根源在于日期字符串的格式不匹配,以及对JDBC驱动返回类型的误解。

为什么会出现带T的时间字符串?

MySQL 8.0+版本的JDBC驱动(mysql-connector-java 8.x)默认开启了useLegacyDatetimeCode=false配置,会将数据库中的DATETIME类型字段映射为Java 8引入的java.time.LocalDateTime类,而不是旧的java.sql.Timestamp。当你调用rs.getObject(0)并强制转换为String时,LocalDateTime的默认字符串格式是ISO-8601标准的yyyy-MM-dd'T'HH:mm:ss(带T分隔符),但Timestamp.valueOf(String)方法仅支持yyyy-MM-dd HH:mm:ss(空格分隔)的格式,这就导致了转换报错。

几种可行的解决方案

  • 方案1:直接使用ResultSet的getTimestamp()方法(最简便)
    跳过转成字符串的步骤,让JDBC驱动直接帮你完成类型转换:

    Timestamp createTimestamp = rs.getTimestamp(0);
    
  • 方案2:使用Java 8+的新日期API(推荐)
    既然驱动已经返回LocalDateTime,直接使用更现代的日期类处理会更灵活,后续如果需要转成Timestamp也很方便:

    // 直接获取LocalDateTime对象
    LocalDateTime createTime = rs.getObject(0, LocalDateTime.class);
    // 如需转换为Timestamp
    Timestamp createTimestamp = Timestamp.valueOf(createTime);
    
  • 方案3:手动处理带T的字符串(不推荐,仅作应急)
    如果必须处理已有的带T字符串,可以先替换分隔符再转换:

    String timeStr = ((String)data[0][0]).replace('T', ' ');
    Timestamp createTimestamp = Timestamp.valueOf(timeStr);
    

    注意:这种方式硬编码替换字符,若后续格式变化容易出问题,优先推荐前两种方案。

内容的提问来源于stack exchange,提问作者Javier Pérez Escamilla

火山引擎 最新活动