Java中如何将Date对象转换为dd-MM-yyyy格式并返回对应Date对象
问题根源
你出现异常的核心原因是代码逻辑参数类型不匹配:
SimpleDateFormat的format()方法仅支持传入Date、Long等时间类型参数,你在构造方法中先将入参Date转为String类型的newDate,再传入format()方法,直接触发参数类型不匹配异常,导致Jackson反序列化时无法实例化Ship对象,最终抛出ValueInstantiationException。- 额外的隐患:
SimpleDateFormat是非线程安全类,直接定义为类的普通成员变量,在并发场景下会出现格式错乱的问题。
修复方案
方案1:直接修正现有代码逻辑
修改构造方法中的日期处理代码,直接传入Date对象进行格式化即可,同时建议把SimpleDateFormat改为局部变量或者用线程安全的日期工具类替代:
// 构造方法内的日期处理逻辑修改为 this.date = formatter.format(date);
如果使用Java 8及以上版本,更推荐使用线程安全的DateTimeFormatter替代SimpleDateFormat:
import java.time.ZoneId; import java.time.format.DateTimeFormatter; // 类中定义全局常量,DateTimeFormatter是线程安全的 private static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("dd-MM-yyyy"); // 构造方法内转换逻辑 this.date = date.toInstant().atZone(ZoneId.systemDefault()).toLocalDate().format(DATE_FORMATTER);
方案2:使用Jackson注解自动处理格式(更推荐)
无需手动写格式化逻辑,直接通过Jackson提供的@JsonFormat注解自动处理序列化和反序列化的日期格式,代码更简洁易维护:
- 首先修改
date字段类型为Date,添加注解:
import com.fasterxml.jackson.annotation.JsonFormat; // 按需求设置对应的时区 @JsonFormat(pattern = "dd-MM-yyyy", timezone = "GMT+8") private Date date;
- 构造方法中直接赋值即可,不需要额外的格式化处理:
public Ship(@JsonProperty("loadingPoint") String loadingPoint, /* 其他参数省略 */ @JsonProperty("Date") Date date) { // 其他字段赋值 this.date = date; }
这样Jackson会自动帮你完成dd-MM-yyyy格式和Date对象之间的互转,不需要你手动处理格式逻辑。
内容的提问来源于stack exchange,提问作者Roshan Kannaujiya
相关产品推荐
相关产品推荐

