JSTL - 使用带有 java.sql.Timestamp 的 formatDate

Posted

技术标签:

【中文标题】JSTL - 使用带有 java.sql.Timestamp 的 formatDate【英文标题】:JSTL - use formatDate with a java.sql.Timestamp 【发布时间】: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 可以使用它?

【问题讨论】:

【参考方案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 的子类。

以上是关于JSTL - 使用带有 java.sql.Timestamp 的 formatDate的主要内容,如果未能解决你的问题,请参考以下文章

为啥要使用 JSTL?当我们在 JSP 文件中使用带有连接字符串的数据库连接来获取从 servlet 发送的数据时会有啥危害[重复]

JSTL基础 SimpleTagSupport 自定义标签 带有属性

String 转化成java.sql.Date和java.sql.Time

JSTL,自定义一个标签的功能案例

Java中六大时间类的使用和区别

Java中六大时间类的使用和区别