JSP使用fmt:formatDate时String转java.util.Date失败求助
问题根源
从错误日志里的核心提示就能定位问题:
javax.el.ELException: Cannot convert [2020-01-28T12:53:00.000+0000] of type [class java.lang.String] to [class java.util.Date]
你的circular.createdOn字段实际是字符串类型(格式为带时区偏移的ISO 8601格式),但<fmt:formatDate>标签要求传入的是java.util.Date类型对象,EL容器尝试自动转换这个字符串时失败,才抛出了这个异常。
解决方案
方案1:后端修正字段类型(推荐)
最彻底的解决方式是在后端把createdOn字段的类型改成java.util.Date(如果是Java 8及以上版本,也可以用java.time.LocalDateTime或OffsetDateTime这类新日期API),确保数据从业务层/数据库传递到前端时就是标准的日期对象,而非字符串。
如果是Spring项目,检查实体类的日期字段配置,比如用JPA注解确保映射正确:
import java.util.Date; import javax.persistence.Temporal; import javax.persistence.TemporalType; public class Circular { @Temporal(TemporalType.TIMESTAMP) private Date createdOn; // 对应的getter和setter方法 }
同时检查序列化配置(比如Jackson),避免日期被自动序列化为字符串。
方案2:前端先解析字符串为Date再格式化
如果暂时没法修改后端代码,可以先用<fmt:parseDate>把字符串日期解析成Date对象,再用<fmt:formatDate>格式化展示:
<%-- 先解析字符串,pattern要完全匹配你的日期格式 --%> <fmt:parseDate value="${circular.createdOn}" pattern="yyyy-MM-dd'T'HH:mm:ss.SSSZ" var="parsedCreatedOn" /> <%-- 再按需求格式化展示 --%> <fmt:formatDate type="both" dateStyle="medium" timeStyle="short" value="${parsedCreatedOn}" />
这里的pattern参数是关键:yyyy-MM-dd'T'HH:mm:ss.SSSZ完全对应你提供的2020-01-28T12:53:00.000+0000格式,其中Z用来匹配末尾的时区偏移+0000。
方案3:适配Java 8+新日期API(可选)
如果后端用的是Java 8引入的OffsetDateTime这类新日期类型,JSTL的fmt标签可能无法直接支持。这时可以选择:
- 在后端直接把日期格式化成需要的字符串,再传递到前端展示;
- 自定义EL函数来处理新日期类型的格式化逻辑。
内容的提问来源于stack exchange,提问作者Travelling Salesman

