심심풀이로 백준을 풀다가 두 날짜가 주어졌을 때 몇일이 차이가 나는지에 대한 문제를 풀게 되었다.
윤년까지 고려해야 했는데, 어려운 문제는 아니지만 Java 자체에 이걸 손쉽게 풀어줄 수 있는 패키지가 있는지를 찾아봤다.
가장 먼저 찾을 수 있었던 내용은 java.util.Date
를 사용해서 날짜 차이를 구하는 것이었다.
문제는 저건 윤년을 고려하지 않는다(...) 그래서 윤년을 고려한 계산은 아예 없는건가...라고 생각을 했는데 Java8부터 지원되는 것이 하나 있었다.
바로 LocalDate
와 ChronoUnit
을 활용해가지고 계산하는 것이다. 각각 java.time
과 java.temporal
에 속하는 class다.
LocalDate
time-zone을 신경쓰지 않는 날짜 객체로, 연도-달-일의 구조를 가진다.
of
method를 활용해서 간단히 만들 수 있다.
import java.time.LocalDate;
...
LocalDate date1 = LocalDate.of(2022, 1, 1);
...
ChronoUnit
사실 이 녀석이 핵심이다. 두 날짜 사이의 간격을 여러 단위로 측정하는데 도움을 주는 녀석이다.
원하는 단위를 택한 다음에 between
method를 사용하면 된다. 단위가 뭐가 있는지는 doc 참고.
'일' 단위로 차이를 알고 싶으면 다음과 같이 하자.
import java.time.LocalDate;
import java.time.temporal.ChronoUnit;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int year1 = sc.nextInt(), month1 = sc.nextInt(), day1 = sc.nextInt();
int year2 = sc.nextInt(), month2 = sc.nextInt(), day2 = sc.nextInt();
LocalDate date1 = LocalDate.of(year1, month1, day1);
LocalDate date2 = LocalDate.of(year2, month2, day2);
long daysBetween12 = ChronoUnit.DAYS.between(date1, date2);
System.out.println("D-" + daysBetween12);
sc.close();
}
}
밑은 예시 출력이다. 2004년 1월 1일과 2005년 1월 1일 사이의 '일'단위 차이가 366으로 제대로 나옴을 볼 수 있다. 2004년이 윤년이기 때문.
2004 1 1
2005 1 1
D-366