【问题标题】:JSTL - use formatDate with a java.sql.TimestampJSTL - 使用带有 java.sql.Timestamp 的 formatDate
【发布时间】:2012-05-12 02:45:30
【问题描述】:

我有一个标签如下:

<%@ tag body-content="empty"%>
<%@ attribute name="timestamp" required="true" type="java.sql.Timestamp"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>
<jsp:useBean id="dateValue" class="java.util.Date" />
<c:if test="${not empty timestamp}">
    <jsp:setProperty name="dateValue" property="time" value="${timestamp}" />
    <span title="${timestamp}"> <fmt:formatDate value="${dateValue}"
            pattern="MM/dd/yyyy HH:mm" /> </span>
</c:if>

我收到以下错误:

错误 500:com.ibm.ws.jsp.JspCoreException:java.lang.IllegalArgumentException:无法将 java.sql.Timestamp 类型的 5/1/12 10:36 AM 转换为 long

我试图按照this answer 将时间戳转换为 JSTL 中的日期,因此我不会更改我的 servlet 中的任何内容。如何使用 JSTL 将 java.sql.Timestamp 转换为日期,以便 formatDate 可以使用它?

【问题讨论】:

    标签: java servlets timestamp jstl jsp-tags


    【解决方案1】:

    你需要传入Timestamp#getTime()

    <jsp:setProperty name="dateValue" property="time" value="${timestamp.time}" />
    

    但这一切都毫无意义。 java.sql.Timestamp 已经是 java.util.Date 的子类。所以这也应该这样做:

    <%@ attribute name="timestamp" required="true" type="java.sql.Timestamp"%>
    <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
    <%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>
    <c:if test="${not empty timestamp}">
        <span title="${timestamp}"><fmt:formatDate value="${timestamp}"
                pattern="MM/dd/yyyy HH:mm" /></span>
    </c:if>
    

    顺便说一句,我还会更改您的模型以将属性声明为java.util.Date。您不应该在模型和视图中使用java.sql.Timestamp,而只能在数据层中使用。您不需要通过解析/格式化将ResultSet#getTimestamp() 转换为java.util.Date。只需向上转换就足够了。

    例如

    import java.util.Date;
    
    public class SomeModel {
    
        private Date somefield;
    
        // ...
    }
    

    someModel.setSomefield(resultSet.getTimestamp("somefield"));
    

    【讨论】:

    • 哦,笨蛋。我从未尝试直接在时间戳上使用formatDate,因为我在网上看到有关必须将时间戳转换为日期才能与formatDate 一起使用的问题。谢谢!
    • 其他问题是关于时间戳,如 long 值,表示纪元时间。但实际上你已经有一个 java.sql.Timestamp ,因此它已经是 java.util.Date 的子类。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-21
    • 1970-01-01
    相关资源
    最近更新 更多