如何在JSTL的<c:forEach>循环中递增日期字符串?
在JSTL中循环递增日期(MM/dd/yyyy格式)
JSTL没有原生的日期加减标签,我们可以结合<fmt:parseDate>、<fmt:formatDate>和Java的Calendar类来实现需求,以下是完整的解决方案:
实现步骤
- 将输入的日期字符串解析为
java.util.Date对象 - 借助
Calendar类处理日期递增逻辑,自动处理月末、年末等边界情况 - 循环内先使用当前日期,再执行加1天操作
完整代码示例
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> <%-- 初始化传入的日期字符串 --%> <c:set var="inputDateStr" value="${param.STARTDATE}" /> <%-- 把字符串解析为Date对象,匹配MM/dd/yyyy格式 --%> <fmt:parseDate var="currentDate" value="${inputDateStr}" pattern="MM/dd/yyyy" /> <%-- 初始化Calendar实例并设置初始日期 --%> <c:set var="dateCalendar" value="${java.util.Calendar.getInstance()}" /> <c:set var="ignore" value="${dateCalendar.setTime(currentDate)}" /> <c:forEach begin="1" end="7" varStatus="loop"> <%-- 格式化为MM/dd/yyyy字符串供业务使用 --%> <fmt:formatDate var="formattedDate" value="${dateCalendar.time}" pattern="MM/dd/yyyy" /> <%-- 这里写你需要用日期字符串执行的业务逻辑,比如输出或赋值 --%> <div>第${loop.count}天:${formattedDate}</div> <%-- 将日期加1天,自动处理边界情况 --%> <c:set var="ignore" value="${dateCalendar.add(java.util.Calendar.DATE, 1)}" /> </c:forEach>
关键细节说明
<fmt:parseDate>确保将字符串安全转为Date对象,避免直接操作字符串引发的格式错误Calendar.add()方法会自动处理月末、年末的日期跳转(比如12/31加1天会变为次年1/1)- 用
ignore变量接收Calendar.setTime()和add()的返回值(这两个方法是void类型),保证EL表达式可以正常执行这些方法
内容的提问来源于stack exchange,提问作者Rhett Harrison
相关产品推荐
相关产品推荐

