Thymeleaf中基于当前日期减X天实现条件样式问题求助
Thymeleaf根据日期判断设置文本颜色问题解决
我需要在Thymeleaf模板中通过if语句,根据当前日期减去7天的结果,给过期日期设置不同颜色。模型使用的是java.time.LocalDate类型的日期字段,尝试了两种方法都失败了:
方法一:模板内直接计算日期(报错)
尝试在模板中使用#temporals工具类计算日期,代码如下:
<td th:if="${user.expiry_date.isBefore(#temporals.createNow().minus(7, ChronoUnit.DAYS))}" th:text="${#dates.format(user.expiry_date, 'dd-MM-yyyy')}" style="color: red"/>
抛出异常:
org.springframework.expression.spel.SpelEvaluationException: EL1007E: Property or field 'DAYS' cannot be found on null
原因:ChronoUnit是java.time.temporal.ChronoUnit类的静态枚举,SpEL上下文默认未导入该类,直接引用ChronoUnit.DAYS会导致找不到对应的属性,因为ChronoUnit在当前上下文为null。
方法二:后台传递计算后的日期(访问失败)
在Controller中提前计算好日期并传入模型:
model.addAttribute("userList", organisationService.getAllOrganisations()); model.addAttribute("localDateNow", LocalDate.now().minusDays(7));
但模板中访问变量时失败,尝试过两种写法:
<td th:if="${user.expiry_date.isBefore(localDateNow)}" th:text="${#dates.format(user.expiry_date, 'dd-MM-yyyy')}" style="color: orange"/>
<td th:if="${user.expiry_date.isBefore(${localDateNow})}" th:text="${#dates.format(user.expiry_date, 'dd-MM-yyyy')}" style="color: orange"/>
原因:
- 第二种写法错误嵌套了
${},SpEL表达式中不需要在内部再包裹${}; #dates工具类仅支持java.util.Date类型,而模型中的expiry_date是java.time.LocalDate,使用#dates.format会导致兼容性问题。
正确解决方案
方案一:模板内直接计算(修正版)
使用#temporals的minusDays方法替代minus+ChronoUnit,同时用#temporals.format格式化LocalDate:
<td th:if="${user.expiry_date.isBefore(#temporals.createNow().toLocalDate().minusDays(7))}" th:text="${#temporals.format(user.expiry_date, 'dd-MM-yyyy')}" style="color: red"/>
#temporals.createNow()返回LocalDateTime,需要用toLocalDate()转为LocalDate后再减天数;minusDays(7)直接实现减7天的需求,无需引用ChronoUnit。
方案二:后台传递日期(修正版)
保持后台传参不变(建议变量名更清晰),修正模板中的表达式和格式化方法:
// Controller代码 model.addAttribute("userList", organisationService.getAllOrganisations()); model.addAttribute("dateMinus7Days", LocalDate.now().minusDays(7));
<!-- 模板代码 --> <td th:if="${user.expiry_date.isBefore(dateMinus7Days)}" th:text="${#temporals.format(user.expiry_date, 'dd-MM-yyyy')}" style="color: orange"/>
- 移除表达式内嵌套的
${},直接使用变量名; - 用
#temporals.format替代#dates.format来处理LocalDate类型的日期。
内容的提问来源于stack exchange,提问作者WebStormer
相关产品推荐
相关产品推荐

