준호씨의 블로그

Java - "x개월 x일 남았습니다" 구하기 본문

개발이야기

Java - "x개월 x일 남았습니다" 구하기

준호씨 2020. 3. 17. 23:53
반응형

아무말 대잔치

보통 D-Day는 종종 구할 일이 있고 예제도 많습니다. 하지만 D-Day를 다르게 표현하는 "x개월 x일 남았습니다"는 예제를 찾기 힘듭니다. 개월 수 차이 구하는 예제도 많던데 이상하게도 몇 개월 며칠은 보이지 않더군요. 최근에 몇 개월 며칠 남았지 구하는 로직을 만 들일이 있어서 만들면서 정리해 보았습니다.

아참 Java8 이상을 사용하셔야 됩니다. 이전 버전에서도 구하는 방법은 있겠지만 Java8을 쓰면 정말 쉽게 구할 수 있기 때문입니다. 요즘 다들 Java8 이상 사용하고 계시죠? ^^;

정답부터 적어보면 다음과 같습니다.

LocalDate theDate = LocalDate.of(2030, 4, 1);
Period period = LocalDate.now().until(theDate);

System.out.println(period.getYears() * 12 + period.getMonths() + "개월");
System.out.println(period.getDays() + "일");

2020년 4월 1일 까지 120개월 15일 남았네요. 참 쉽죠?

Java8부터 LocalDate클래스가 등장합니다. (참고: https://docs.oracle.com/javase/8/docs/api/java/time/LocalDate.html) LocalDate가 생기고 각종 날짜 계산이 많이 편해졌습니다. LocalDate의 until 함수가 반환하는 Period는 남은 기간들을 쉽게 추출해낼 수 있습니다.

오늘이 아니고 특정일을 기준으로 몇개월 며칠 남았는지 확인하려면 다음과 같이 하면 됩니다.

LocalDate startDate = LocalDate.of(2020, 3, 17);
LocalDate endDate = LocalDate.of(2030, 4, 1);

Period period = startDate.until(endDate);

assertThat(period.getYears() * 12 + period.getMonths()).isEqualTo(120);
assertThat(period.getDays()).isEqualTo(15);

 

여기서 남은 년을 추가하고 싶을 수 있습니다. 남은 년, 개월, 일은 어떻게 구할까요? 위의 예제를 보고 금방 눈치챘으리라 봅니다. 더 쉽습니다.

그냥 이미지로 붙여봄

 

LocalDate startDate = LocalDate.of(2020, 3, 17);
LocalDate endDate = LocalDate.of(2030, 4, 1);

Period period = startDate.until(endDate);

assertThat(period.getYears()).isEqualTo(10);
assertThat(period.getMonths()).isEqualTo(0);
assertThat(period.getDays()).isEqualTo(15);

 

남은 개월, 일 구할 때 실수하기 좋은게 getYears() * 12를 빼먹게 되면 몇 년 치에 해당하는 개월 수가 누락될 수 있으니 주의해야 합니다. (사실 제가 이 실수를 했었습니다. 글로 정리하다가 갑자기 떠올랐네요.)

반응형
Comments