2014-10-08 99 views
0

我試圖在我的JSP頁面中使用fmt:formatDate標籤顯示日期。fmt:formatDate顯示月份太多

所以在我的JSP IM這樣做:

<td><fmt:formatDate pattern="dd-MM-yyyy" value="${document.documentDate}" /></td> 

的document.documentDate是我從的XMLGregorianCalendar得到一個值,那我顯然解析。

public Date getDocumentDate() { 
    return convertDateFromXMLDate(documentDate); 
} 

protected Date convertDateFromXMLDate(XMLGregorianCalendar date) { 
    Calendar cal = Calendar.getInstance(); 
    cal.set(Calendar.YEAR, date.getYear()); 
    cal.set(Calendar.MONTH, date.getMonth()); 
    cal.set(Calendar.DAY_OF_MONTH, date.getDay()); 
    cal.set(Calendar.HOUR, date.getHour()); 
    cal.set(Calendar.MINUTE, date.getMinute()); 
    cal.set(Calendar.SECOND, date.getSecond()); 
    return cal.getTime(); 

} 

XMLGregorianCalendar值是正確的。 cal.getTime()也是正確的。 (我調試的cal.getTime.getMonth()值。

雖然我的JSP顯示了一種也越來越成功了!而不是2014年1月1日這表明2014年1月2日(DD-MM-YYYY)

有什麼想法?

回答

2

這就是問題所在:。

cal.set(Calendar.MONTH, date.getMonth()); 

XMLGregorianCalendar使用1-12個月範圍java.util.Calendar使用的0-11個月的範圍你想要的:

cal.set(Calendar.MONTH, date.getMonth() - 1); 

另請注意,您可能想使用new GregorianCalendar()而不是Calendar.getInstance()以避免它不成爲公曆日曆的可能性......並且您還應該考慮是否真的需要它在系統默認時區中。 (也許你這樣做,也許你沒有,如果這是在服務器上運行的代碼,我建議你不要 - 爲什麼服務器的位置應該改變結果?)

1

幾個月是基於零的,所以你應該使用:

cal.set(Calendar.MONTH, date.getMonth()-1);