<fmt:formatDate> 标签(一文讲透)

更新时间:

💡一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论

  • 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于 Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...点击查看项目介绍 ;
  • 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;

截止目前, 星球 内专栏累计输出 82w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 2900+ 小伙伴加入学习 ,欢迎点击围观

在 Web 开发中,日期格式化是一个高频需求。无论是显示订单创建时间、用户注册日期,还是展示活动截止时间,开发人员都需要将日期对象转换为用户友好的字符串形式。在 Java Web 开发中,<fmt:formatDate> 标签凭借其简洁的语法和强大的功能,成为实现这一目标的利器。本文将从基础用法、核心属性、实战案例等维度,系统讲解这一标签的使用技巧,并通过类比和实例帮助读者快速掌握其精髓。


一、为什么需要 <fmt:formatDate> 标签?

想象一下,如果直接在 JSP 页面中写入日期格式化的逻辑,代码可能会充斥着复杂的字符串拼接和时间戳转换。而 <fmt:formatDate> 标签就像一位“日期翻译官”,它能自动将日期对象转换为指定格式的字符串,同时支持国际化和时区调整,极大简化了开发流程。

例如,假设后端传递了一个 Date 对象,开发者只需一行代码即可将其格式化为“yyyy-MM-dd HH:mm:ss”的形式:

<fmt:formatDate value="${date}" pattern="yyyy-MM-dd HH:mm:ss" />  

这样的代码不仅简洁,还能避免因手动处理时区或格式错误引发的 bug。


二、基础用法:让日期“开口说话”

1. 核心语法与必要属性

<fmt:formatDate> 标签的最小语法结构如下:

<fmt:formatDate value="日期对象" pattern="格式字符串" />  
  • value:必填属性,表示要格式化的日期对象(如 Date 类型变量)。
  • pattern:可选属性,定义日期的显示格式。

示例:显示当前时间

在 JSP 页面中,可以通过 EL 表达式获取当前时间:

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>  
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>  

<c:set var="now" value="<%= new java.util.Date() %>" />  
当前时间:  
<fmt:formatDate value="${now}" pattern="yyyy-MM-dd HH:mm:ss" />  

运行后,页面将显示类似“2023-10-05 14:30:22”的结果。

2. 省略 pattern 属性的场景

当不需要自定义格式时,可通过 typedateStyle/timeStyle 属性快速选择预设格式。例如:

<!-- 显示完整日期 -->
<fmt:formatDate value="${now}" type="date" dateStyle="full" />  
<!-- 输出:2023年10月5日 星期四 -->  

<!-- 显示简短时间 -->
<fmt:formatDate value="${now}" type="time" timeStyle="short" />  
<!-- 输出:14:30 -->  

此处的 dateStyletimeStyle 类似“服装预设”,分为 defaultshortmediumlongfull 五种选项,分别对应不同详细程度的格式。


三、深入解析:核心属性详解

1. pattern 属性:自定义格式的“密码本”

通过 pattern 属性,开发者可以精确控制日期的显示格式。常见的符号及其含义如下表:

符号说明示例
y年份(4 位)2023
M月份(1-12)10
d日期(1-31)05
H24 小时制小时(0-23)14
h12 小时制小时(1-12)2
m分钟(0-59)30
s秒(0-59)22
E星期名称(如“星期四”)Thursday
a上午/下午标识符PM

示例:组合符号实现复杂格式

<!-- 输出:2023年10月05日 星期四 下午14时30分 -->
<fmt:formatDate value="${now}" pattern="yyyy年MM月dd日 EEEE aHH时mm分" />  

2. type 属性:指定格式化类型

type 可选值包括 date(仅日期)、time(仅时间)、both(日期+时间),例如:

<!-- 仅显示日期 -->
<fmt:formatDate value="${now}" type="date" pattern="yyyy-MM-dd" />  

<!-- 显示完整日期时间 -->
<fmt:formatDate value="${now}" type="both" pattern="yyyy-MM-dd HH:mm:ss" />  

3. timeZone 属性:跨越时区的“时空转换器”

当需要显示不同时区的时间时,可通过 timeZone 属性指定时区标识符(如 GMT+8Asia/Shanghai)。例如:

<!-- 显示东京时间 -->
<fmt:formatDate value="${now}" pattern="yyyy-MM-dd HH:mm" timeZone="Asia/Tokyo" />  

四、实战案例:解决真实场景问题

案例 1:订单创建时间的友好显示

假设有一个订单对象 order,其 createTime 字段为 Date 类型,需要以“2023-10-05 14:30”格式显示:

订单创建时间:<fmt:formatDate value="${order.createTime}" pattern="yyyy-MM-dd HH:mm" />  

案例 2:国际化日期显示

通过结合 <fmt:setLocale>,可实现多语言日期格式化。例如,切换到中文显示:

<fmt:setLocale value="zh_CN" />  
<fmt:formatDate value="${now}" dateStyle="full" />  
<!-- 输出:2023年10月5日 星期四 -->  

案例 3:处理不同时区的用户活动时间

假设用户位于纽约(时区 America/New_York),需显示其活动时间:

用户活动时间:  
<fmt:formatDate value="${activityTime}" pattern="yyyy-MM-dd HH:mm" timeZone="America/New_York" />  

五、常见问题与解决方案

问题 1:格式化后结果为空

原因value 属性引用的日期对象为 null
解决:在 JSP 中添加空值判断,或确保后端传递的日期对象不为空。

问题 2:时区设置无效

原因:时区标识符格式错误(如使用 GMT+8 而非 Asia/Shanghai)。
解决:参考 Java 支持的时区列表 选择正确的标识符。

问题 3:pattern 符号不生效

原因:符号拼写错误或未使用大写字母(如 mm 表示分钟,MM 表示月份)。
解决:核对符号表并修正拼写。


六、总结与进阶方向

<fmt:formatDate> 标签凭借其简洁的语法和丰富的功能,成为 Java Web 开发中日期格式化的首选工具。通过掌握其核心属性(如 patterntypetimeZone),开发者可以轻松实现从基础显示到复杂时区转换的多样化需求。

对于希望进一步提升技能的读者,建议探索以下方向:

  1. 其他 JSTL 标签:如 <fmt:formatNumber> 用于数字格式化,或 <fmt:message> 实现国际化。
  2. Java 8 时间 API:通过 java.time 包(如 LocalDateTime)替代旧版 Date 类,获得更现代化的日期处理能力。

通过本文的学习,相信读者已能熟练运用 <fmt:formatDate> 标签,让日期显示从“技术代码”变为“用户友好”的自然语言。接下来,不妨动手尝试编写自己的日期格式化案例,巩固所学知识!

最新发布