본문 바로가기
JAVA

[JAVA] 두 날짜 데이터값 계산하는 방법 (faet.D-DAY 계산)

by GoodDayDeveloper 2021. 8. 1.
반응형

 

안녕하세요. 요즘 프로젝트때문에 바빠 포스팅을 한동안 못하다가 오랜만에 하려하니 기분이 좋네요!

 

오늘은 두 데이터의 날짜 값을 계산하는, 즉 디데이 값을 구하는 포스팅을 하려합니다.

구현 화면입니다. 동그라미 안에 강좌가 시작하는 일자까지의 남은일을 구하는 방법입니다.

많은 프로젝트에서 많이 사용되며, 저 또한 반드시 다시 쓸일이 있을 것 같은 느낌이네요!

 

대략적인 구조는 자바에서 for문으로 두날짜의 계산 값을 해시맵에 담은 다음,

JSP에 뿌려주는 과정을 정리하려합니다.

 

 

디데이 사진....

 

 


 

CONTROLLER

 

우선 자바에서 원하는 리스트를 뽑아줍니다.

 

1
List<EducationTempVO> boardList6 = educationService.getEduMainList(educationTempVO);    //강좌정보
cs

 

 

그리고 반복문전에 가장 상단에 사용할 해시맵 선언해줍니다.

계산할 기준 날짜데이터와 오늘날짜 데이터를 String으로 받은 다음,

String형태에 맞는 데이터포맷을 설정해줍니다.

그리고 parse을 통해서 Date형식으로 변경한다음 , long을 통해서 date.gettime으로 연산해줍니다.

Date.getTime() 은 해당날짜를 기준으로 1970년 00:00:00 부터 몇 초가 흘렀는지를 반환해주면서, 

24*60*60*1000을 연산해주면 일수가 나옵니다.

v 객체의 Dday변수에 연산한 Ddays값을 넣어주고 해시맵에 put로 Dday값을 넣어준 다음

model.addattribute로 뷰페이지로 빼줍니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
//남은 강좌일
Map<EducationTempVO, Integer> dDayMap = new HashMap<EducationTempVO, Integer>();
 
for(EducationTempVO v : boardList6) {
 
  String strDate = v.getEdu_date_start();  // 기준 날짜 데이터 (("yyyy-MM-dd")의 형태)
  String todayFm = new SimpleDateFormat("yyyy-MM-dd").format(new Date(System.currentTimeMillis())); // 오늘날짜
 
  SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
 
  Date date = new Date(dateFormat.parse(strDate).getTime()); 
  Date today = new Date(dateFormat.parse(todayFm).getTime());
      
  long calculate = date.getTime() - today.getTime();
 
  int Ddays = (int) (calculate / ( 24*60*60*1000));
  v.setDday(Ddays);
  System.out.println("두 날짜 차이일 : " + Ddays);
 
  dDayMap.put(v,  Ddays);
    
}
 
model.addAttribute("dDayMap" , dDayMap);
cs

 

 

 

system.out.println으로 콘솔에 입력값이 아래처럼 나왔네요.

 

 

 

그럼 이 데이터 값으로 JSP페이지에서 나타내도록 합니다.

 

 

JSP

 

우선 강좌리스트 값 (boardList6)을 c:forEach를 통해 반복시킵니다.

그리고 그 밑에 c:forEach로 해시맵 값(dDayMap)을 반복시킵니다.

 

참고로 해시맵에서 JSTL로 값을 꺼낼 경우,

Key 값은 model키값.key / Value값은 model키값.value로 꺼내시면 됩니다.

(key값이나 value값이 배열이면 model키값.key or value.변수명으로 꺼내시면 됩니다.)

 

그리고 특정 기존 리스트값과 해시맵의 특정값을 매칭시킨다음, (저 같은 경우 강좌명으로 했습니다.)

구한 연산값이 0보다 크면 value값을 나타내고, 0보다 작으면 End를 표현하였습니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
<c:forEach var="result" items="${boardList6}" varStatus="status">
<li>
  <span class="date">
    <c:forEach var="i" items="${dDayMap}"> 
          <c:if test="${result.edu_title eq i.key.edu_title && i.key.dday > 0}" >
                D-${i.value}
          </c:if>
          <c:if test="${result.edu_title eq i.key.edu_title && i.key.dday < 0}" >
                END
          </c:if>
    </c:forEach>
  </span>
</li>
cs

 

 

결과화면

 

 

아직 경험이 없어서 조금 돌려서 구현한 감이 없지않아 있네요.. 나중에 개선된 코드를 다시 올리겠습니다.

반응형

댓글