2012-05-02 38 views
7

Tôi có một thẻ như sau:JSTL - sử dụng formatDate với một 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> 

tôi nhận được tuy nhiên các lỗi sau:

Lỗi 500: com.ibm.ws .jsp.JspCoreException: java.lang.IllegalArgumentException: không thể chuyển đổi 5/1/12 10:36 của kiểu lớp java.sql.Timestamp dài

tôi đã cố gắng để làm theo this answer để chuyển đổi một tim estamp đến một ngày trong JSTL, vì vậy tôi sẽ không thay đổi bất cứ điều gì trong servlet của tôi. Làm thế nào tôi có thể chuyển đổi một java.sql.Timestamp thành một ngày để formatDate có thể hoạt động với nó, bằng cách sử dụng JSTL?

Trả lời

9

Bạn cần phải vượt qua trong Timestamp#getTime().

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

Nhưng điều này không có ý nghĩa gì cả. java.sql.Timestamp đã là một phân lớp của java.util.Date. Vì vậy, điều này cũng nên làm:

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

Tôi cũng thay đổi mô hình của bạn để khai báo thuộc tính là java.util.Date. Bạn không nên sử dụng java.sql.Timestamp trong mô hình và chế độ xem, nhưng chỉ trong lớp dữ liệu. Bạn không cần phải chuyển đổi ResultSet#getTimestamp() thành java.util.Date bằng cách phân tích cú pháp/định dạng. Chỉ cần upcasting là đủ.

Ví dụ:

import java.util.Date; 

public class SomeModel { 

    private Date somefield; 

    // ... 
} 

với

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

Oh, derp. Tôi chưa bao giờ thử sử dụng 'formatDate' trực tiếp trên dấu thời gian, vì tôi đã thấy các câu hỏi trực tuyến về việc phải chuyển đổi một dấu thời gian thành một ngày để sử dụng nó với' formatDate'. Cảm ơn! –

+0

Các câu hỏi khác đã nói về dấu thời gian như trong một giá trị 'long' cho biết thời gian epoch. Nhưng thực ra bạn đã có một 'java.sql.Timestamp', do đó, nó đã là một lớp con của' java.util.Date'. – BalusC

Các vấn đề liên quan