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

Spring Boot Data JPA如何传入0303格式日期(日-月)?

解决Spring Boot Data JPA中ddMM格式日期的插入问题

看起来你遇到的问题是Spring Boot Data JPA无法解析ddMM格式(日在前、月在后,比如0303代表3日3月)的日期字符串并持久化到数据库。别担心,我给你两种可行的解决方案,根据你的技术栈和业务需求选择就行:

方案一:使用Java 8+ LocalDate(推荐)

Java 8引入的日期时间API(java.time.LocalDate)比旧的java.util.Date更简洁、安全,结合Spring的@DateTimeFormat注解就能轻松处理自定义格式:

修改实体类

@Entity
@Table(name = "execution")
public class Execution implements Serializable{
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "execution_id")
    private Integer executionGroupId;
    
    // 用LocalDate替代Date,指定ddMM格式的解析规则
    @Column(name = "ExecutionDate")
    @DateTimeFormat(pattern = "ddMM")
    private LocalDate executionDate;
    
    // 生成Getter和Setter
}

补充说明

  • @DateTimeFormat(pattern = "ddMM")会告诉Spring在绑定请求参数(比如REST接口、表单提交)时,自动把0303这样的字符串解析成LocalDate对象(年份默认取当前系统年)。
  • 如果业务需要指定固定年份,你可以在Service层手动补充,比如:
    // 假设输入的日期字符串是"0303",指定年份为2024
    String inputDateStr = "0303";
    LocalDate date = LocalDate.of(2024, Integer.parseInt(inputDateStr.substring(2)), Integer.parseInt(inputDateStr.substring(0,2)));
    execution.setExecutionDate(date);
    
  • 数据库的ExecutionDate字段建议用DATE类型,和LocalDate完美匹配。

方案二:基于旧Date类自定义转换器

如果你坚持使用java.util.Date,可以通过JPA的AttributeConverter自定义日期转换逻辑:

1. 创建自定义转换器

import javax.persistence.AttributeConverter;
import javax.persistence.Converter;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.time.Year;

@Converter(autoApply = true) // 自动应用到所有匹配的字段
public class DdMmDateConverter implements AttributeConverter<String, Date> {

    private static final SimpleDateFormat FULL_DATE_FORMAT = new SimpleDateFormat("ddMMyyyy");
    // 默认使用当前年份,可根据业务调整
    private final int defaultYear = Year.now().getValue();

    @Override
    public Date convertToDatabaseColumn(String ddMmStr) {
        if (ddMmStr == null || ddMmStr.length() != 4) {
            return null;
        }
        try {
            // 拼接年份,转成完整的日期字符串
            String fullDateStr = ddMmStr + defaultYear;
            return FULL_DATE_FORMAT.parse(fullDateStr);
        } catch (ParseException e) {
            throw new IllegalArgumentException("无效的日期格式:" + ddMmStr + ",请传入ddMM格式(如0303)", e);
        }
    }

    @Override
    public String convertToEntityAttribute(Date date) {
        if (date == null) {
            return null;
        }
        SimpleDateFormat ddMmFormat = new SimpleDateFormat("ddMM");
        return ddMmFormat.format(date);
    }
}

2. 修改实体类字段

@Entity
@Table(name = "execution")
public class Execution implements Serializable{
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "execution_id")
    private Integer executionGroupId;
    
    @Column(name = "ExecutionDate")
    @Convert(converter = DdMmDateConverter.class) // 指定转换器
    private Date executionDate;
    
    // 生成Getter和Setter
}

注意事项

  • 转换器会自动将ddMM格式的字符串转成Date存入数据库,同时从数据库读取时转回ddMM字符串。
  • 如果需要动态指定年份,可以修改转换器逻辑,比如从其他业务参数获取年份。

额外检查点

  • 确认数据库的ExecutionDate字段类型是DATE或TIMESTAMP,和实体类字段类型匹配。
  • 如果是通过REST接口传入参数,确保请求参数的格式严格为ddMM(比如0303,不要加分隔符)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 23:42:43