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

Spring向MySQL插入Date与Timestamp报错的解决方法咨询

解决Spring Boot向MySQL插入Date和Timestamp时的类型转换错误

你遇到的核心问题是输入的日期时间格式和Spring/MySQL期望的格式不匹配,导致类型转换失败。我们一步步拆解解决:

1. 修复dateOfDeparture的Date类型转换错误

从错误日志能直接定位问题:

Failed to convert from type [java.lang.String] to type [@javax.persistence.Column @org.springframework.format.annotation.DateTimeFormat java.util.Date] for value '22-02-2020'; nested exception is java.lang.IllegalArgumentException: Parse attempt failed for value [22-02-2020]

你的实体类给dateOfDeparture配置的@DateTimeFormat(pattern = "yyyy-MM-dd")是年-月-日格式,但输入的22-02-2020是日-月-年格式,Spring无法正确解析。

解决方案:

把注解的格式改成和输入匹配的样式:

@Column(name="departuredate")
@DateTimeFormat(pattern = "dd-MM-yyyy") // 改为日-月-年格式,匹配输入的22-02-2020
private Date dateOfDeparture;

2. 修复estimatedTravelTime的Timestamp类型转换错误

错误日志明确给出了Timestamp的格式要求:

Timestamp format must be yyyy-mm-dd hh:mm:ss[.fffffffff]

java.sql.Timestamp需要完整的日期+时间格式,但你只输入了12:00(仅时间部分),所以转换失败。这里有两种适配方案,根据业务需求选择:

方案A:保留MySQL的timestamp字段类型

如果业务要求departuretime必须存储完整的日期时间,需要两步处理:

  1. 给实体类字段添加时间格式注解,让Spring能解析单独的时间字符串:
@Column(name="departuretime")
@DateTimeFormat(pattern = "HH:mm") // 指定输入的时间格式为小时:分钟
private Timestamp estimatedTravelTime;
  1. 在保存Flight前,把dateOfDeparture的日期和输入的时间拼接成完整的Timestamp。比如在你的FlightServices中处理:
public Flight saveFlight(Flight flight) {
    // 提取出发日期的日历信息
    Calendar dateCal = Calendar.getInstance();
    dateCal.setTime(flight.getDateOfDeparture());
    
    // 提取输入时间的日历信息
    Calendar timeCal = Calendar.getInstance();
    timeCal.setTime(flight.getEstimatedTravelTime());
    
    // 将时间部分合并到日期日历中
    dateCal.set(Calendar.HOUR_OF_DAY, timeCal.get(Calendar.HOUR_OF_DAY));
    dateCal.set(Calendar.MINUTE, timeCal.get(Calendar.MINUTE));
    dateCal.set(Calendar.SECOND, 0); // 秒数设为0
    
    // 转换为Timestamp并赋值
    flight.setEstimatedTravelTime(new Timestamp(dateCal.getTimeInMillis()));
    
    return flightRepository.save(flight);
}

方案B:修改MySQL字段类型为time(更适合仅存时间的场景)

如果业务只需要存储时间(不需要关联日期),这是更合理的做法:

  1. 修改MySQL表的字段类型:
ALTER TABLE FLIGHT MODIFY COLUMN departuretime TIME NOT NULL;
  1. 实体类对应字段改用Java 8的LocalTime(推荐)或java.sql.Time:
@Column(name="departuretime")
@DateTimeFormat(pattern = "HH:mm")
private LocalTime estimatedTravelTime; // 直接存储时间部分,无需日期

这样Spring就能直接把输入的12:00解析为对应的时间类型,无需额外拼接。

验证修改

完成上述调整后,重启应用,输入22-02-2020作为出发日期、12:00作为出发时间,就能成功插入MySQL数据库了。

内容的提问来源于stack exchange,提问作者Abdul Rahman

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 16:42:51