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

Spring应用中java.util.Date格式不匹配及对象转换问题咨询

解决java.util.Date与ObjectMapper的日期转换异常问题

首先得明确一个关键:java.util.Date本身不存储任何日期格式,它内部就是个从1970年1月1日开始的毫秒数。你看到的"Mon dd, yyyy hh:mm:ss AM"只是它默认toString()方法输出的格式,和实际存储的时间毫无关系。SimpleDateFormat的作用只是把字符串转成Date对象,或者把Date对象转成指定格式的字符串,根本改不了Date的本质。

你遇到的ObjectMapper转换异常,核心是没有给它配置正确的日期解析/序列化格式,导致它用默认规则处理时和你的输入格式不匹配。下面是具体解决步骤:

1. 给ObjectMapper配置指定的日期格式

直接初始化ObjectMapper时设置对应的日期格式化规则,确保和你的输入字符串"08-10-2020"格式一致(注意区分是月-日-年还是日-月-年,对应MM-dd-yyyy或dd-MM-yyyy):

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import java.text.SimpleDateFormat;

// 初始化并配置ObjectMapper
ObjectMapper objectMapper = new ObjectMapper();
SimpleDateFormat dateFormat = new SimpleDateFormat("MM-dd-yyyy"); // 按你的实际格式调整
objectMapper.setDateFormat(dateFormat);
// 关闭时间戳输出,强制用指定格式序列化日期
objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);

2. 实体类与转换示例

假设你的实体类结构如下:

import java.util.Date;

public class TargetEntity {
    private Date targetDate;

    // getter和setter方法
    public Date getTargetDate() {
        return targetDate;
    }

    public void setTargetDate(Date targetDate) {
        this.targetDate = targetDate;
    }
}

用配置好的ObjectMapper完成转换:

// 反序列化:JSON字符串转实体
String jsonInput = "{\"targetDate\":\"08-10-2020\"}";
TargetEntity entity = objectMapper.readValue(jsonInput, TargetEntity.class);

// 序列化:实体转JSON(输出指定格式的日期)
String jsonOutput = objectMapper.writeValueAsString(entity);
// 输出结果会是 {"targetDate":"08-10-2020"}

3. 更推荐的替代方案:使用Java 8+新日期API

java.util.Date是过时的API,线程不安全且设计缺陷多。推荐改用java.time.LocalDate(仅日期)或LocalDateTime(日期时间),配合Jackson的jackson-datatype-jsr310模块处理:

实体类配置

import java.time.LocalDate;
import com.fasterxml.jackson.annotation.JsonFormat;

public class TargetEntity {
    // 直接在属性上指定日期格式
    @JsonFormat(pattern = "MM-dd-yyyy")
    private LocalDate targetDate;

    // getter和setter
    public LocalDate getTargetDate() {
        return targetDate;
    }

    public void setTargetDate(LocalDate targetDate) {
        this.targetDate = targetDate;
    }
}

ObjectMapper初始化

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;

ObjectMapper objectMapper = new ObjectMapper();
// 注册Java 8日期模块
objectMapper.registerModule(new JavaTimeModule());
// 禁用时间戳输出
objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);

这种方案不需要手动处理SimpleDateFormat的线程安全问题,代码更简洁可靠。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 20:46:07