Skip to content

在首页中格式化日期

了解了这些工具对象后,我们可以用它们来修改首页中日期的展示方式。

原本我们在 HomeController 中这样处理日期(提前格式化):

java
SimpleDateFormat dateFormat = new SimpleDateFormat("dd MMMM yyyy");
Calendar cal = Calendar.getInstance();

WebContext ctx = new WebContext(webExchange, webExchange.getLocale());
// 控制器中提前格式化日期为字符串
ctx.setVariable("today", dateFormat.format(cal.getTime()));

templateEngine.process("home", ctx, writer);

现在可以简化控制器逻辑——只传递原始的 Calendar 对象,把格式化交给视图层处理

java
WebContext ctx = new WebContext(webExchange, webExchange.getLocale());
// 直接传递 Calendar 对象,不提前格式化
ctx.setVariable("today", Calendar.getInstance());

templateEngine.process("home", ctx, writer);

然后在视图(模板)中通过 #calendars 工具对象完成日期格式化:

html
<p>
  Today is: <span th:text="${#calendars.format(today,'dd MMMM yyyy')}">13 May 2011</span>
</p>

核心逻辑解释

  1. 前后端职责划分
    • 改造前:控制器既要处理业务逻辑,又要负责日期格式化(视图层的展示逻辑),职责混杂;
    • 改造后:控制器仅传递原始数据(Calendar 对象),视图层通过 Thymeleaf 工具对象处理格式化,符合“后端管数据,前端管展示”的设计原则。
  2. #calendars 工具对象的优势
    • 内置的 format 方法支持按指定模式格式化 Calendar 对象,无需手动创建 SimpleDateFormat
    • 自动适配上下文的 Locale(比如传入西班牙语 Locale 时,月份会显示为西班牙语),而手动创建 SimpleDateFormat 需额外设置 Locale,否则使用系统默认值。
  3. 代码简化与可维护性: 移除了控制器中 SimpleDateFormat 的创建、格式化等代码,减少重复逻辑;若后续需要修改日期格式(如改为 yyyy-MM-dd),只需修改模板中的格式字符串,无需改动后端代码。

拓展:适配 java.time 新 API(JDK8+)

如果项目使用 JDK8 及以上,推荐使用 #temporals 工具对象处理 LocalDateTime/LocalDate 等新日期类型,更符合现代开发规范:

java
// 控制器传递 LocalDate 对象
ctx.setVariable("today", LocalDate.now());
html
<!-- 模板中格式化 LocalDate -->
<span th:text="${#temporals.format(today,'dd MMMM yyyy')}">13 May 2011</span>

总结

  1. 使用 Thymeleaf 的 #calendars/#temporals 工具对象,可将日期格式化逻辑从控制器移到模板层,简化后端代码,明确前后端职责。
  2. 工具对象的格式化方法自动适配上下文的 Locale,比手动创建 SimpleDateFormat 更简洁、更易适配多语言场景。
  3. 格式修改仅需调整模板中的格式字符串,无需改动后端代码,提升代码可维护性。