You need to enable JavaScript to run this app. Thymeleaf中无法使用#dates.format格式化类内LocalDate字段
优惠活动
大模型
产品
解决方案
定价
更多

Thymeleaf中无法使用#dates.format格式化类内LocalDate字段

报错核心原因

#dates 表达式工具类仅支持 java.util.Date、java.sql.Date 等传统日期类型,完全不兼容Java 8引入的 java.time.LocalDate 类型,因此找不到匹配的format(LocalDate, String)方法,直接触发方法不存在的异常。

适配解决方法

方法1:使用Thymeleaf内置的#temporals工具类(推荐)

Thymeleaf 3.0及以上版本专门为java.time包下的所有日期时间类型(包括LocalDate、LocalDateTime等)提供了#temporals格式化工具,替换原有#dates调用即可,全程不需要修改自定义类的任何日期相关代码。
修改后的可正常运行的核心代码:

<ul >
   <li th:each="i:${#numbers.sequence(0, gemaakteCursus.aantalDagen - 1)}">
    <span th:text="${#temporals.format(gemaakteCursus.getStartDatum().plusDays(i),'dd/MM/yyyy') }"/>
  </li>
</ul>

注意:原代码中#numbers.sequence存在两类语法问题:

  1. 表达式书写错误:0(gemaakteCursus.aantalDagen)-1 相当于把数值0当作方法调用后续参数,属于完全无效的SpEL语法
  2. 参数顺序错误:#numbers.sequence的参数规则为(起始值, 结束值),如果需要从第0天遍历到总天数减1的位置,原写法把结束值写为1,会触发空序列或者逆序遍历的问题。

方法2:直接调用LocalDate自带的格式化能力(适配老版本Thymeleaf)

如果使用的Thymeleaf版本低于3.0,没有内置#temporals支持,可以直接在表达式中调用LocalDate实例的format方法,通过静态引入DateTimeFormatter指定目标格式,示例代码:

<span th:text="${gemaakteCursus.getStartDatum().plusDays(i).format(T(java.time.format.DateTimeFormatter).ofPattern('dd/MM/yyyy'))}"/>

避坑提示

  • 不要做类型转换把LocalDate转为java.util.Date再走#dates流程,会增加无意义的转换逻辑,反而容易出现时区不一致的问题
  • Spring Boot 2.x及以上版本默认集成的Thymeleaf 3.x版本,已经自动启用了#temporals支持,不需要额外引入第三方依赖
  • 格式化时如果需要使用MMM格式显示月份缩写,要注意如果未指定本地化参数,默认会按照服务端默认语言输出月份文本,可能出现不符合预期的结果。

内容的提问来源于stack exchange,提问作者Johan Belien

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.23 18:54:02