我试图在我的JSP页面中显示一个日期,使用fmt:formatDate标记。
所以在我的JSP中我这样做:
<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显示一个月太多了!而不是1-1-2014,它显示1-2-2014(dd-MM-yyyy)
有什么想法吗?
答案 0 :(得分: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 :(得分:1)
月份基于零,因此您应该使用:
cal.set(Calendar.MONTH, date.getMonth()-1);