서론

달력이 들어가는 페이지를 개발하다보면 오늘 혹은 사용자가 선택한 날짜가 어느 기간 안에 들어가는지 체크해야할 때가 있다.

예를 들면 오늘 날짜인 ‘2019-03-20’이 ‘2019-03-01’ ~ ‘2019-03-21’ 사이에 포함되는지 체크해야하는데 이것을 위해 Java8부터 추가된 java.time 을 이용해서 기능을 구현해보았다.

본론

/**
 * date가 startDate와 EndDate 사이에 있는지 반환  
 * 
 * @param date yyyymmdd
 * @param startDate yyyymmdd
 * @param endDate yyyymmdd
 * @return
*/
public static boolean isWithinRange(String date, String startDate, String endDate) throws ParseException {
    if(date.length() != 8 || startDate.length() != 8 || endDate.length() != 8){
        return false;
    }        
    
    date = date.substring(0,4) + "-" + date.substring(4, 6) + "-" + date.substring(6, 8);
    startDate = startDate.substring(0,4) + "-" + startDate.substring(4, 6) + "-" + startDate.substring(6, 8);
    endDate = endDate.substring(0,4) + "-" + endDate.substring(4, 6) + "-" + endDate.substring(6, 8);
    
    LocalDate localdate = LocalDate.parse(date);
    LocalDate startLocalDate = LocalDate.parse(startDate);
    LocalDate endLocalDate = LocalDate.parse(endDate);
    endLocalDate = endLocalDate.plusDays(1); // endDate는 포함하지 않으므로 +1일을 해줘야함.
    
    return ( ! localdate.isBefore( startLocalDate ) ) && ( localdate.isBefore( endLocalDate ) );
}

LocalDate : [년,월,일]과 같은 날짜만 표현하는 클래스 (시간은 포함하지 않는다)

LocalDate를 이용하여 구현한 소스이다. LocalDate.parse를 이용하여 String 형태의 날짜를 LocalDate로 바꿔준다. 참고로 파라미터로 받는 3개의 String 날짜들은 ‘20190301’과 같이 ‘yyyymmdd’형태로 들어온다.

검사하려는 날짜, 기간의 시작날짜, 종료날짜를 LocalDate로 변환 후 종료날짜에 +1일을 해준다. 이유는 그냥 더하지 않고 체크하면 종료날짜는 기간 안에 포함하지 않기 때문이다. 물론, 종료날짜를 기간 안에 포함하지 않으려면 더하지 않으면 된다.

그리고 isBefore로 비교해준다. 시작날짜보다 이전날짜가 아니면서(!localdate.isBefore(startLocalDate)) 종료날짜(※ +1일을 해준 종료날짜)보다는 이전날짜이면(localdate.isBefore(endLocalDate)) 검색하려는 기간 안에 있는 날짜가 맞기 때문에 true를 반환해준다.