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

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"/>

原因:

  1. 第二种写法错误嵌套了${},SpEL表达式中不需要在内部再包裹${};
  2. #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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 22:27:26