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
相关产品推荐
相关产品推荐

