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存在两类语法问题:
- 表达式书写错误:
0(gemaakteCursus.aantalDagen)-1相当于把数值0当作方法调用后续参数,属于完全无效的SpEL语法- 参数顺序错误:
#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
相关产品推荐
相关产品推荐

