준호씨의 블로그

Java - D-Day 구하기. Java8이상 버전과 이전 버전 방식 본문

개발이야기

Java - D-Day 구하기. Java8이상 버전과 이전 버전 방식

준호씨 2020. 8. 22. 00:13
반응형

Java8 이상을 사용하면 D-Day 구하기는 비교적 쉬운 편입니다.

// LocalDate fromDate = LocalDate.of(2020, 8, 21);
LocalDate fromDate = LocalDate.now();
LocalDate toDate = LocalDate.of(2020, 8, 22);

// ChronoUnit.DAYS.between
System.out.println(DAYS.between(fromDate, toDate));
assertThat(DAYS.between(fromDate, toDate))
        .isEqualTo(1);

// until
System.out.println(fromDate.until(toDate, DAYS));
assertThat(fromDate.until(toDate, DAYS))
        .isEqualTo(1);

// Duration.between
System.out.println(Duration.between(fromDate.atStartOfDay(), toDate.atStartOfDay()).toDays()); // 1
assertThat(Duration.between(fromDate.atStartOfDay(), toDate.atStartOfDay()).toDays())
        .isEqualTo(1);

ChronoUnit.DAYS.between 메서드를 이용하면 간단합니다. DAYS.between(fromDate, toDate)로 간단히 D-Day를 구할 수 있습니다.

LocalDate에 있는 until 메서드를 이용하는 방법도 있습니다. 자신을 기준으로 다른 날짜까지의 기간을 구할 수 있습니다. 사실 DAYS.between도 내부적으로는 until을 사용하고 있습니다.

Duration.between 메서드를 사용하는 방법도 있는데요. 날짜의 시간을 추가하되 같은 시간으로 맞춘 다음 between을 구한다면 그것을 toDays메서드를 이용해서 날짜로 변환해 주어야 합니다. 직접 코딩하기에는 번거롭기 때문에 앞의 방법을 이용하는 것이 더 편리할 것입니다.

 

Java8 이전 버전 사용 시

만약 Java8 이전 버전을 사용하고 있다면 Calendar를 사용해야 되는데요. 좀 더 번거롭고 가독성도 떨어지는 편이라 가급적이면 Java8 이상으로 버전업 하시길 권장합니다.

@Test
public void ddayCalendar() {
    Calendar calStart = Calendar.getInstance();
    Calendar calEnd = Calendar.getInstance();

    calStart.set(2020, 3-1, 17);
    calEnd.set(2020, 3-1, 19);

    assertThat(getDiffDays(calStart, calEnd)).isEqualTo(2);
}

private Long getDiffDays(Calendar calStart, Calendar calEnd) {
    return (calEnd.getTimeInMillis() - calStart.getTimeInMillis()) / (60 * 60 * 24 * 1000);
}

밀리 초로 시간을 환산한 다음 차이를 구하고 하루의 밀리 초로 나누면 됩니다.

다음은 오늘을 기준으로 목표 일자까지 남은 일 수를 구하는 getDDay메서드를 만든 예제입니다.

@Test
public void ddayCalendar2() {
    Calendar theDay = Calendar.getInstance();
    int days = 10;
    theDay.add(Calendar.DATE, days);

    assertThat(getDDay(theDay)).isEqualTo(days);
}

private Long getDDay(Calendar theDay) {
    Calendar today = Calendar.getInstance();
    today.set(Calendar.HOUR_OF_DAY, 0);
    today.set(Calendar.MINUTE, 0);
    today.set(Calendar.SECOND, 0);

    return (theDay.getTimeInMillis() - today.getTimeInMillis()) / (60 * 60 * 24 * 1000);
}

Calendar클래스를 사용 방법도 불편한데 밀리초 단위로 바꿔서 나누기까지 직접 해 주어야 하는 번거로움이 있습니다. 메서드를 한번 만들어 두면 다음부터는 호출만 하면 되긴 하겠지만 좀 번거로운 게 사실입니다. 프로젝트마다 조금씩 사용 방법도 달라질 수 있고요.

 

반응형
Comments