2012-05-02 4 views
7

Ich habe einen Tag mit folgendem:JSTL - verwendet format mit einem 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> 

ich aber die folgende Fehlermeldung erhalten:

Fehler 500: com.ibm.ws .jsp.JspCoreException: java.lang.IllegalArgumentException: Kann nicht 5/1/12 10.36 vom Typ Klasse java.sql.Timestamp ich lange

konvertieren versuchte this answer zu folgen einem tim zu konvertieren estamp zu einem Datum in JSTL, damit ich nichts in meinem Servlet ändern würde. Wie kann ich ein java.sql.Timestamp in ein Datum umwandeln, so dass formatDate damit arbeiten kann, mit JSTL?

Antwort

9

Sie müssen Timestamp#getTime() übergeben.

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

Aber das macht alles keinen Sinn. Die java.sql.Timestamp ist bereits eine Unterklasse von java.util.Date. So sollte dies auch tun:

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

ich übrigens würde auch Ihre Modelle ändern die Eigenschaft als java.util.Date anstatt zu erklären. Sie sollten java.sql.Timestamp nicht im Modell und in der Ansicht verwenden, sondern nur in der Datenschicht. Sie müssen ResultSet#getTimestamp() nicht in java.util.Date konvertieren, indem Sie analysieren/formatieren. Nur Upcasting ist ausreichend.

z.

import java.util.Date; 

public class SomeModel { 

    private Date somefield; 

    // ... 
} 

mit

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

Oh, derp. Ich habe nie versucht, 'formatDate' direkt auf dem Zeitstempel zu verwenden, da ich online Fragen dazu sah, wie man einen Zeitstempel in ein Datum umwandelt, um ihn mit' formatDate' zu ​​verwenden. Vielen Dank! –

+0

Andere Fragen sprachen über Zeitstempel als in einem "langen" Wert, der die Epochezeit anzeigt. Sie haben aber bereits einen 'java.sql.Timestamp', der wiederum bereits eine Unterklasse von' java.util.Date' ist. – BalusC