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

JSP使用fmt:formatDate时String转java.util.Date失败求助

解决JSP中fmt:formatDate无法将字符串日期转为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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 14:42:47