首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

JSP 頁面將毫秒時間戳轉換為日期的多種實現方式

     編輯:程式設計疑難解答

在 JSP 中將後端傳遞的 long 型毫秒時間戳轉為可讀日期,主要有三種主流做法:JSTL 格式化標籤(推薦)、Java 片段、EL 表達式配合自定義函數。本文詳細對比並給出完整代碼。

場景假設

  • 後端 List<Map> 或 List<Entity> 放入 request:request.setAttribute("list", list)
  • * 每項含 createTime (Long, 毫秒時間戳)

方案一:JSTL <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>

優點

  • 零 Java 代碼在 JSP,符合 MVC 分層。
  • 支援時區、語系、自定義格式,功能完整。
  • 效能佳,標籤處理過程不產生臨時字串物件過多。

方案二:JSP 片段 <% %> + 表達式 <%= %> (傳統、快速原型)

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

缺點

  • Java 代碼混雜 HTML,難維護。
  • SimpleDateFormat 非線程安全,若在高併發下複用實例會出錯 (此處每次 new 尚可)。
  • 取值繁瑣:需用 pageContext.findAttribute 或 request.getAttribute 取出集合再索引。

方案三:EL 表達式 + 自定義 EL 函數 (優雅復用)

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 日期格式化邏輯,減少線程安全與維護風險。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved