fmt:formatDate显示月份过多

时间:2014-10-08 11:54:07

标签: java datetime jstl

我试图在我的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)

有什么想法吗?

2 个答案:

答案 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);