2012-05-02 11 views
7

tengo una etiqueta con la siguiente:JSTL - formatDate utilizar con un java.sql.Timestamp

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

me sale el siguiente error sin embargo:

Error 500: com.ibm.ws .jsp.JspCoreException: java.lang.IllegalArgumentException: no se puede convertir 5/1/12 10:36 de la clase de tipo java.sql.Timestamp a largo

yo estaba tratando de seguir this answer para convertir un tim estamp a una fecha en JSTL, así que no habría cambiado nada en mi servlet. ¿Cómo puedo convertir un java.sql.Timestamp en una fecha para que formatDate pueda trabajar con él, usando JSTL?

Respuesta

9

Debe pasar Timestamp#getTime().

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

Pero esto no tiene sentido. El java.sql.Timestamp ya es una subclase de java.util.Date. Por lo que también debe hacer:

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

yo por cierto también cambiar sus modelos de declarar la propiedad como java.util.Date lugar. No debe usar java.sql.Timestamp en el modelo y vista, pero solo en la capa de datos. No necesita convertir ResultSet#getTimestamp() a java.util.Date analizando/formateando. Solo upcasting es suficiente.

E.g.

import java.util.Date; 

public class SomeModel { 

    private Date somefield; 

    // ... 
} 

con

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

Oh, derp. Nunca intenté usar 'formatDate' directamente en la marca de tiempo, ya que vi preguntas en línea sobre cómo convertir una marca de tiempo en una fecha para usarla con' formatDate'. ¡Gracias! –

+0

Otras preguntas hablaban de la marca de tiempo como en un valor 'largo' que indica la hora de la época. Pero en realidad ya tienes un 'java.sql.Timestamp' que a su vez ya es una subclase de' java.util.Date'. – BalusC