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

Spring Boot中Ajax POST日期字符串转yyyy-mm-dd HH:mm:ss格式报错处理

解决Spring Boot中日期字符串转yyyy-MM-dd HH:mm:ss格式的400错误

这个问题我碰到过好几次,本质是Spring MVC无法正确将前端传来的日期字符串反序列化成后端的Date类型,触发了HttpMessageNotReadableException,导致400 Bad Request错误。给你几个靠谱的解决方案:


方案1:在实体类字段上添加注解(局部配置)

直接在InvoiceForm的dueDate字段上标注日期格式化注解,指定预期的格式和时区:

import com.fasterxml.jackson.annotation.JsonFormat;
import org.springframework.format.annotation.DateTimeFormat;
import java.util.Date;

public class InvoiceForm {
    // 其他字段...
    
    // 反序列化时匹配yyyy-MM-dd HH:mm:ss格式,时区根据你的业务调整(比如GMT+8是中国时区)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    // 处理表单参数提交场景的格式化(Ajax传JSON时主要靠@JsonFormat,但加上更全面)
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date dueDate;
    
    // getter和setter方法
}

说明:

  • @JsonFormat是给Jackson框架用的,负责处理JSON请求体的反序列化;
  • @DateTimeFormat用于处理传统表单提交的参数(比如application/x-www-form-urlencoded格式);
  • 时区一定要和前端保持一致,避免出现日期偏移的问题。

方案2:全局配置日期格式化(推荐)

如果你的项目中有很多日期字段需要统一格式,没必要每个字段都加注解,直接全局配置Jackson的规则:

创建一个Spring配置类:

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder;

import java.text.SimpleDateFormat;

@Configuration
public class JacksonDateConfig {
    @Bean
    public ObjectMapper objectMapper(Jackson2ObjectMapperBuilder builder) {
        ObjectMapper objectMapper = builder.createXmlMapper(false).build();
        
        // 设置全局Date类型的序列化/反序列化格式
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        objectMapper.setDateFormat(dateFormat);
        
        // 如果使用Java 8的LocalDateTime/LocalDate等时间API,需要注册对应模块
        objectMapper.registerModule(new JavaTimeModule());
        // 关闭将日期序列化为时间戳的默认行为
        objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
        
        return objectMapper;
    }
}

说明:

  • 这个配置会对所有Date/Java 8时间类型的字段生效;
  • 如果你用的是Java 8的时间API(比如LocalDateTime),记得引入jackson-datatype-jsr310依赖(Spring Boot starter-web默认已经包含)。

方案3:前端确保传递的日期字符串格式完全匹配

有时候问题出在前端传递的日期格式和后端预期不一致,比如前端传的是yyyy-MM-dd,而后端要的是yyyy-MM-dd HH:mm:ss,这时候可以在前端先把日期转成正确格式再发送请求。比如用moment.js处理:

// 假设你用jQuery和moment.js
const dueDateInput = $('#dueDate').val();
// 将输入的日期转为yyyy-MM-dd HH:mm:ss格式
const formattedDueDate = moment(dueDateInput).format('YYYY-MM-DD HH:mm:ss');

// 构造请求体
const invoiceForm = {
    // 其他字段...
    dueDate: formattedDueDate
};

// 发送Ajax请求
$.ajax({
    url: '/your-invoice-api-url',
    type: 'POST',
    contentType: 'application/json', // 一定要指定Content-Type为JSON
    data: JSON.stringify(invoiceForm),
    success: function(res) {
        // 处理成功逻辑
    },
    error: function(err) {
        // 处理错误
    }
});

注意:

  • 前端传递的字符串格式必须和后端配置的完全一致,包括大小写(比如YYYY对应四位年份,yyyy也可以,但要统一)、分隔符(-和:不要写错);
  • 发送Ajax时要设置contentType: 'application/json',确保后端按JSON格式解析请求体。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:58:45