본문으로 바로가기

※ JSTL 시간,날짜계산 (parseDate / pareNumber)




- 서버에서 받은 데이터를 JSP페이지에서 날짜나,시간 계산하여 화면에 노출해야할 경우가 많은데 이 때 JTSL에서 제공하는 Formatting Tags(fmt) 를 사용하면 대부분 처리가 가능합니다.   ( Javascript 를 사용해도 되지만.. 서버단에서 안전하게 처리하고 싶은 경우)



Step1. JSTL Formatting Tags Include

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

- JSP페이지 내에서 JSTL fmt 태그 라이브러리를 사용 할 수 있도록  상단에 include 해줍니다.

* 날짜, 시간 계산을 위하여 주로 사용할 Formatting Tags 
1<fmt:formatNumber>

To render numerical value with specific precision or format.

2<fmt:parseNumber>

Parses the string representation of a number, currency, or percentage.

3<fmt:formatDate>

Formats a date and/or time using the supplied styles and pattern.

4<fmt:parseDate>

Parses the string representation of a date and/or time

Step2. <fmt:parseDate>를 이용하여 String >> Date 형 변환    

- 계산할 데이터 형태가 가공되지 않은 문자열 형태일 경우 많으므로 계산을 위해 DATE형으로 변환 시켜 줍니다. 

<fmt:parseDate>태그를 이용하여 문자열로 이루어진 여러가지 포맷의 데이터를 DATE형으로 변환 시킬 수 있습니다.


 
startDate = 2017-07-27
endDate = 2017-07-30
<fmt:parseDate var="startDate_D"  value="${startDate }" pattern="yyyy-MM-dd"/>
<fmt:parseDate var="endDate_D" value="${endDate }"  pattern="yyyy-MM-dd"/>
 
startTime = 0215
endTime = 0100
<fmt:parseDate var="startTime_D" value="${startTime }"  pattern="HHmm"/>
<fmt:parseDate var="endTime_D" value="${endTime }"  pattern="HHmm"/>
cs


Step3. <fmt:parseNumber>를 이용하여 Date >> Number 변환    

- Date타입의 두 변수를 계산하기 위하여 Number 타입으로 변경해 줍니다. 
- 변경되는 단위는 밀리세컨드(ms) 입니다. 
- 날짜는 타임스탬프를 기준으로 (1970-01-01 00:00:00) 계산됩니다.

1초 = 1,000 ms (1* 1000)
1분 = 60,000 ms (60 * 1000) 
1시간 = 3,600,000 ( 60 * 60 * 1000 )
1일 = 86,400,000 ( 24 * 60 * 60 * 1000)

<fmt:parseNumber var="startTime_N" value="${startTime_D.time}" integerOnly="true" /> 8100000
<fmt:parseNumber var="endTime_N" value="${endTime_D.time}" integerOnly="true"/>  3600000
cs


Step4. 숫자로 변환된 두 데이터를 연산후 <fmt:formatNumber> 등을 이용하여 원하는 포맷과 단위로 화면에 출력    


- 원하는 포맷으로 출력



+ 예제



1. 두 날짜의 차이
 
startDate = 2017-07-27
endDate = 2017-07-30
 
<fmt:parseDate var="startDate_D"  value="${startDate }" pattern="yyyy-MM-dd"/>
<fmt:parseDate var="endDate_D" value="${endDate }"  pattern="yyyy-MM-dd"/>
 
<fmt:parseNumber var="startDate_N" value="${strPlanDate.time / (1000*60*60*24)}" integerOnly="true" />
<fmt:parseNumber var="endDate_N" value="${endPlanDate.time / (1000*60*60*24)}" integerOnly="true" /> 
 
 ${startDate_N - endDate_N}   >>  3
-----------------------------------------------------------------------------------------------
 
2.  hhmm포맷의 두 시간의 합  (결과 hhmm으로 표기)
 
Time1 = 0215
Time2 = 0100
<fmt:parseDate var="Time1_D" value="${Time1}"  pattern="HHmm"/>  
<fmt:parseDate var="Time2_D" value="${Time2}"  pattern="HHmm"/>
>> DATE타입으로 변환
 
<fmt:parseNumber var="sum_hh" value="${(Time1_D + Time2_D  / (1000*60)) / 60 }" integerOnly="true" />    3
<fmt:parseNumber var="sum_mm" value="${(Time1_D + Time2_D  / (1000*60)) % 60 }" integerOnly="true" />  15
>> 분단위로 변환(195+60) 하여 계산후 60으로 나눈 몫과 나머지로 hh 와 mm을 각각 구함  
 
<fmt:formatNumber var="format_hh" value="${sum_hh}" minIntegerDigits="2" />  03
<fmt:formatNumber var="format_mm" value="${sum_mm}" minIntegerDigits="2" />  15
>> hhmm 포맷으로 출력하기 위해  formatNumber 태그 사용
 
${format_hh}${format_mm}  >> 0315

cs




Reference

https://www.tutorialspoint.com/jsp/jsp_standard_tag_library.htm




더 효율적이고 다양한 방법이 있겠지만 글쓴이가 주로 실무에서 사용하는 방법을 정리할 겸 포스팅합니다. :)

궁금한 점이나 오타, 수정, 요청 사항은 댓글로 남겨주세요. (로그인 없이 가능)