Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

JSTL - use formatDate with a java.sql.Timestamp

I have a tag with the following:

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

I get the following error however:

Error 500: com.ibm.ws.jsp.JspCoreException: java.lang.IllegalArgumentException: Cannot convert 5/1/12 10:36 AM of type class java.sql.Timestamp to long

I was trying to follow this answer to convert a timestamp to a date in JSTL, so I wouldn't have change anything in my servlet. How can I convert a java.sql.Timestamp to a date so that formatDate can work with it, using JSTL?

like image 952
Sarah Vessels Avatar asked May 02 '12 15:05

Sarah Vessels


1 Answers

You need to pass in Timestamp#getTime().

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

But this makes all no sense. The java.sql.Timestamp is already a subclass of java.util.Date. So this should also do:

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

I'd by the way also change your models to declare the property as java.util.Date instead. You should not use java.sql.Timestamp in the model and view, but only in the data layer. You don't need to convert ResultSet#getTimestamp() to java.util.Date by parsing/formatting. Just upcasting is sufficient.

E.g.

import java.util.Date;

public class SomeModel {

    private Date somefield;

    // ...
}

with

someModel.setSomefield(resultSet.getTimestamp("somefield"));
like image 135
BalusC Avatar answered Sep 21 '22 12:09

BalusC