在 JSP 中將後端傳遞的 long 型毫秒時間戳轉為可讀日期,主要有三種主流做法:JSTL 格式化標籤(推薦)、Java 片段、EL 表達式配合自定義函數。本文詳細對比並給出完整代碼。
List<Map> 或 List<Entity> 放入 request:request.setAttribute("list", list)createTime (Long, 毫秒時間戳)
<fmt:formatDate> (最推薦,關注點分離)頁面頂部引入:
<%@ taglib prefix="fmt" uri="https://java.sun.com/jsp/jstl/fmt" %>
<%@ taglib prefix="c" uri="https://java.sun.com/jsp/jstl/core" %>
頁面內迴圈:
<c:forEach items="${list}" var="item">
<!-- 直接格式化 Long 毫秒值,pattern 可自訂 -->
<fmt:formatDate value="${item.createTime}" pattern="yyyy-MM-dd HH:mm:ss" />
<br/>
</c:forEach>
<% %> + 表達式 <%= %> (傳統、快速原型)<c:forEach items="${list}" var="item" varStatus="status">
<%
// 從 pageContext 取值 (EL 變數在片段中不可直接用 ${item})
Long ms = (Long) pageContext.findAttribute("item").get("createTime");
java.util.Date date = new java.util.Date(ms);
%>
<%= date %> <!-- 直接輸出 Date.toString() -->
<!-- 或格式化 -->
<%
java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
out.print(sdf.format(date));
%>
</c:forEach>
SimpleDateFormat 非線程安全,若在高併發下複用實例會出錯 (此處每次 new 尚可)。pageContext.findAttribute 或 request.getAttribute 取出集合再索引。1. 編寫工具類:
package com.util;
public class DateFunc {
public static String fmt(Long ms, String pattern) {
if (ms == null) return "";
return new java.text.SimpleDateFormat(pattern).format(new java.util.Date(ms));
}
}
2. 定義 TLD (/WEB-INF/tld/date.tld):
<taglib xmlns="https://java.sun.com/xml/ns/javaee" version="2.1">
<tlib-version>1.0</tlib-version>
<short-name>date</short-name>
<uri>https://your.com/date</uri>
<function>
<name>fmt</name>
<function-class>com.util.DateFunc</function-class>
<function-signature>java.lang.String fmt(java.lang.Long, java.lang.String)</function-signature>
</function>
</taglib>
3. JSP 使用:
<%@ taglib prefix="my" uri="https://your.com/date" %>
<c:forEach items="${list}" var="item">
${my:fmt(item.createTime, 'yyyy-MM-dd HH:mm:ss')}
</c:forEach>
Controller/Service 層轉好字串再放入 Model:
// Java 8+
list.forEach(item ->
item.put("createTimeStr",
java.time.Instant.ofEpochMilli(item.getCreateTime())
.atZone(java.time.ZoneId.systemDefault())
.format(java.time.format.DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))
)
);
JSP 直接 ${item.createTimeStr}。零邏輯在視圖層,強烈建議生產環境採用。
| 方案 | 優點 | 缺點 | 適用場景 |
|---|---|---|---|
| JSTL fmt:formatDate | 標準、無 Java 代碼、功能全 | 需引入 jstl.jar | 標準 MVC 專案 |
| JSP 片段 | 無需額外 jar、靈活 | 代碼混雜、線程安全隱患 | 快速原型、舊專案維護 |
| EL 自定義函數 | 語法乾淨、可復用 | 需寫 TLD、編譯部署 | 大型專案統一格式化 |
| 後端預格式化 | 視圖最簡潔、效能最佳、線程安全 | 後端多一步轉換 | 生產環境首選 |
新專案請直接使用 方案一 (JSTL) 或 方案四 (後端轉換)。避免在 JSP 寫 Java 日期格式化邏輯,減少線程安全與維護風險。