JSTL 현재날짜 기준 연산

JSTL(JSP Standard Tag Library)에서 현재 날짜를 기준으로 날짜 연산을 수행하는 방법입니다. 날짜 비교, 포맷팅, D-Day 계산 등에 활용됩니다.

언제 사용하나요?

  • 이벤트 종료일까지 남은 일수 표시
  • 새 게시물 표시 (24시간 이내)
  • 마감일 경과 여부 확인
  • 날짜별 조건부 렌더링

현재 날짜 가져오기

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>

<!-- 현재 날짜 -->
<jsp:useBean id="now" class="java.util.Date" />

<!-- 포맷팅 출력 -->
<fmt:formatDate value="${now}" pattern="yyyy-MM-dd" />
<fmt:formatDate value="${now}" pattern="yyyy-MM-dd HH:mm:ss" />
<fmt:formatDate value="${now}" pattern="yyyy년 MM월 dd일" />

날짜 비교

<!-- 밀리초로 변환하여 비교 -->
<jsp:useBean id="now" class="java.util.Date" />

<!-- 이벤트 종료일이 지났는지 확인 -->
<c:choose>
    <c:when test="${event.endDate.time > now.time}">
        <span class="ongoing">진행중</span>
    </c:when>
    <c:otherwise>
        <span class="ended">종료됨</span>
    </c:otherwise>
</c:choose>

<!-- 24시간 이내 게시물인지 확인 -->
<c:set var="oneDayMillis" value="${24 * 60 * 60 * 1000}" />
<c:if test="${now.time - post.regDate.time < oneDayMillis}">
    <span class="new-badge">NEW</span>
</c:if>

D-Day 계산

<!-- 남은 일수 계산 -->
<jsp:useBean id="now" class="java.util.Date" />

<c:set var="oneDayMillis" value="${24 * 60 * 60 * 1000}" />
<c:set var="diffMillis" value="${event.endDate.time - now.time}" />
<c:set var="daysLeft" value="${diffMillis / oneDayMillis}" />

<c:choose>
    <c:when test="${daysLeft > 0}">
        D-<fmt:formatNumber value="${daysLeft}" maxFractionDigits="0" />
    </c:when>
    <c:when test="${daysLeft == 0}">
        D-Day
    </c:when>
    <c:otherwise>
        종료
    </c:otherwise>
</c:choose>

날짜 파싱

<!-- 문자열을 Date로 변환 -->
<fmt:parseDate value="2024-12-31" pattern="yyyy-MM-dd" var="targetDate" />

<!-- 비교 -->
<c:if test="${now.time < targetDate.time}">
    아직 2024년 12월 31일이 되지 않았습니다.
</c:if>

상대적 시간 표시

<!-- 몇 분/시간/일 전 표시 -->
<jsp:useBean id="now" class="java.util.Date" />

<c:set var="diff" value="${now.time - post.regDate.time}" />
<c:set var="diffMinutes" value="${diff / (60 * 1000)}" />
<c:set var="diffHours" value="${diff / (60 * 60 * 1000)}" />
<c:set var="diffDays" value="${diff / (24 * 60 * 60 * 1000)}" />

<c:choose>
    <c:when test="${diffMinutes < 1}">
        방금 전
    </c:when>
    <c:when test="${diffMinutes < 60}">
        <fmt:formatNumber value="${diffMinutes}" maxFractionDigits="0" />분 전
    </c:when>
    <c:when test="${diffHours < 24}">
        <fmt:formatNumber value="${diffHours}" maxFractionDigits="0" />시간 전
    </c:when>
    <c:when test="${diffDays < 7}">
        <fmt:formatNumber value="${diffDays}" maxFractionDigits="0" />일 전
    </c:when>
    <c:otherwise>
        <fmt:formatDate value="${post.regDate}" pattern="yyyy-MM-dd" />
    </c:otherwise>
</c:choose>

월/년 비교

<!-- 이번 달 게시물인지 확인 -->
<fmt:formatDate value="${now}" pattern="yyyyMM" var="currentMonth" />
<fmt:formatDate value="${post.regDate}" pattern="yyyyMM" var="postMonth" />

<c:if test="${currentMonth eq postMonth}">
    <span>이번 달 게시물</span>
</c:if>

<!-- 올해 게시물인지 확인 -->
<fmt:formatDate value="${now}" pattern="yyyy" var="currentYear" />
<fmt:formatDate value="${post.regDate}" pattern="yyyy" var="postYear" />

<c:choose>
    <c:when test="${currentYear eq postYear}">
        <fmt:formatDate value="${post.regDate}" pattern="MM/dd" />
    </c:when>
    <c:otherwise>
        <fmt:formatDate value="${post.regDate}" pattern="yyyy/MM/dd" />
    </c:otherwise>
</c:choose>

시간대 설정

<!-- 한국 시간대 설정 -->
<fmt:setTimeZone value="Asia/Seoul" />

<!-- 또는 -->
<fmt:formatDate value="${now}" pattern="yyyy-MM-dd HH:mm" timeZone="Asia/Seoul" />

주의사항

  • 복잡한 날짜 연산은 서버(Java)에서 처리 권장
  • JSTL 날짜 연산은 밀리초 기반
  • 시간대 설정 주의
  • EL에서 직접 Date 메서드 호출 제한됨