본문 바로가기
개발/Java

[Java] LocalDate, ChronoUnit으로 날짜 간격 구하기(31일 간격으로 나누기)

by Allonsy 2022. 1. 17.
반응형

1. ChronoUnit 을 이용하여 날짜 간격을 구한다

ChronoUnit.DAYS.between(from,to);

 

- ChronoUnit은 TemporalUnit 인터페이스를 구현한 Enum 클래스

DAYS, HOURS, NANOS, MICROS 등등 다양한 시간 단위가 있고,

외부에서 사용할 수 있는 between, getDuration, isDurationEstimated 등 다양한 API를 제공한다

 

[참고]

https://docs.oracle.com/javase/10/docs/api/java/time/temporal/ChronoUnit.html

 

ChronoUnit (Java SE 10 & JDK 10 )

Unit that represents the concept of a day. For the ISO calendar system, it is the standard day from midnight to midnight. The estimated duration of a day is 24 Hours. When used with other calendar systems it must correspond to the day defined by the rising

docs.oracle.com

2. 31일씩 나누어 계산한 시작일 종료일을 List에 담아준다

LocalDate는 불변객체로 plusDays 등의 메소드를 호출했을 때,

해당 객체가 변하는 것이 아니라 새로운 객체를 생성해서 반환해주는 것을 유의

ex. return new LocalDate(year, month, dom);

 

[샘플 코드]

private List<String[]> splitDays(String fromDate, String toDate) {
      List<String[]> searchDates = new ArrayList<>();

      LocalDate from = LocalDate.of(2021,01,01);
      LocalDate to = LocalDate.of(2021,05,21);
      
      LocalDate date = from; // 계산 시 종료일로 사용할 LocalDate 변수
      
      // 1. ChronoUnit을 이용하여 날짜 간격을 구한다
      long days = ChronoUnit.DAYS.between(from,to);
      
      // 2. 31일 간격으로 나눠준다
      long interval = 31; 
      long intervalNumber = days/interval;
      long remainDays = days%interval;
      
      for(int i=0; i<=intervalNumber;i++) {
        String[] searchDate = new String[2];
        
        if(i < intervalNumber ) {
          // 3. 31일 을 더해준다 
          date = date.plusDays(interval);
        }else {
          // 4. 마지막 회차에는 31일로 나눈 나머지 날짜를 더해준다
          date = date.plusDays(remainDays);
        }
        
        // [참고] LocalDate는 불변객체이므로, plusDays를 한 후 date 변수에 다시 할당한다
        
        searchDate[0] = from; // 시작일
        searchDate[1] = date; // 종료일
        searchDates.add(searchDate);

	// 5. 시작일에 하루를 더해 다음 간격을 구하도록 한다
        from = date.plusDays(1);
      }
      
      return searchDates;
    }
반응형

댓글