안녕하세요. 제임스 입니다.
이번에는 두 날짜 간의 차이 구하는 방법에 대해 정리 해보겠습니다.
몇월 몇일 부터 몇월 몇일 까지 몇일 차이인지 구하거나 특정일 까지 D-Day 를 구하거나 할때 사용 할 수 있는 방법입니다.
우선 두 날짜간의 차이를 알기 위해 Calendar 클래스의 getTimeInMills() 라는 함수를 이용하여 천분의 일초 단위 까지 반환 합니다.
그리고 이 초 단위 값을 다시 일단위로 변환하여 최종적으로 두 날짜 간 일 차이를 구할 수 있습니다.
아래 예제를 보시면 좀더 이해가 편하실 겁니다.
1 2 | Calendar baseCal = new GregorianCalendar(2018, Calendar.JANUARY, 11); // 기준 날짜 2018.1.11 Calendar targetCal = new GregorianCalendar(2018, Calendar.MAY, 24);// 비교대상 날짜 2018.5.24 | cs |
기준 날짜를 2018년 1월 11일 로 비교 대상 날짜를 2018년 5월 24일 로 설정 했습니다.
이제 두 날짜간 차이를 getTimeInMills() 함수를 이용하여 천분의 일초 단위로 변환 및 차를 구하겠습니다.
1 | long diffSec = (targetCal.getTimeInMillis() - baseCal.getTimeInMillis())/1000; | cs |
천분의 1초 단위 이므로 1000 으로 나눠 초 단위로 변환 했습니다.
이제 다시 초단위를 일 단위로 변환 하겠습니다.
1 | long diffDays = diffSec / (24*60*60); | cs |
1일은 24(시간) * 60(분) * 60(초) 초 이므로 diffSec 값에서 24*60*60 한 값을 나누면 일로 변환 됩니다.
1 | System.out.println("두 날짜간의 일수 차 = "+diffDays+" 일"); | cs |
위와 같이 결과 값을 프린트하면 아래와 같은 값을 리턴 합니다.
두 날짜간의 일수 차 = 133 일
정말 133일 차이가 나는지는 앞서 포스팅했던 내용과 같이 기준날짜에 133일을 더하거나 비교대상 날짜에 133일을 빼면 알 수 있겠죠?
1 2 3 4 5 6 7 8 9 | SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd"); System.out.println("----------------------------------------"); System.out.println("기준 날짜 = "+sdf.format(baseCal.getTime())); System.out.println("비교 대상 날짜 = "+sdf.format(targetCal.getTime())); System.out.println("----------------------------------------"); baseCal.add(Calendar.DAY_OF_MONTH, (int)diffDays); System.out.println("기준날짜에 "+diffDays+" 일 만큼 더한 날짜 = "+sdf.format(baseCal.getTime())); targetCal.add(Calendar.DAY_OF_MONTH, -(int)diffDays); System.out.println("비교 대상 날짜에 "+diffDays+" 일 만큼 뺀 날짜 = "+sdf.format(targetCal.getTime())); | cs |
yyyy/MM/dd 형태로 기준 날짜와 비교 대상 날짜를 먼저 프린트 합니다.
이후 기준 날짜에 133일을 더하고 비교대상 날짜에서 133일 뺍니다.
결과는 아래와 같습니다.
-------------------------
기준 날짜 = 2018/01/11
비교 대상 날짜 = 2018/05/24
-------------------------
기준 날짜에 133 일 만큼 더한 날짜 = 2018/05/24
비교 대상 날짜에 133 일 만큼 뺀 날짜 = 2018/01/11
제대로 구해진것이 확인 됩니다.
여기서 주의 할 점이 하나 있습니다.
만약 기준 날짜를 Calendar.getInstance() 로 할 경우 오차가 생길 수 있습니다.
천분의 일초 까지 계산을 하기 때문에 올림/내림의 변수가 존재 하여 원치 않는 결과 값이 나올 수 있습니다.
아래 예제를 보여 드리겠습니다.
1 2 3 | Calendar baseCal1 = Calendar.getInstance(); // 기준 날짜 Calendar baseCal2 = new GregorianCalendar(2018, Calendar.JANUARY, 11); // 기준 날짜 2018.1.11 Calendar targetCal = new GregorianCalendar(2018, Calendar.MAY, 24);// 비교대상 날짜 2018.5.24 | cs |
테스트 한 현재 시간 (2018년 1월 11일 오전 1시 59분) 으로 처음 예제와 동일한 날짜 이지만 시간이 초단위까지가 차이가 납니다.
1 2 3 | System.out.println("baseCal 초단위 값 ==> "+baseCal1.getTimeInMillis()); System.out.println("baseCal2 초단위 값 ==> "+baseCal2.getTimeInMillis()); System.out.println("targetCal 초단위 값 ==> "+targetCal.getTimeInMillis()); | cs |
위 코드 결과는 아래와 같습니다.
baseCal1 초단위 값 ==> 1515603810414
baseCal2 초단위 값 ==> 1515596400000
targetCal 초단위 값 ==> 1527087600000
Calendar.getnstance() 한 값을 기준값 또는 비교값으로 설정 할 경우 +/- 1일 정도의 오차가 발생 할 수 있습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | Calendar baseCal = Calendar.getInstance(); // 기준 날짜 Calendar targetCal = new GregorianCalendar(2018, Calendar.MAY, 24);// 비교대상 날짜 2018.5.24 long diffSec = (targetCal.getTimeInMillis() - baseCal.getTimeInMillis())/1000; long diffDays = diffSec / (24*60*60); System.out.println("두 날짜간의 일수 차 = "+diffDays+" 일"); SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd"); System.out.println("----------------------------------------"); System.out.println("기준 날짜 = "+sdf.format(baseCal.getTime())); System.out.println("비교 대상 날짜 = "+sdf.format(targetCal.getTime())); System.out.println("----------------------------------------"); baseCal.add(Calendar.DAY_OF_MONTH, (int)diffDays); System.out.println("기준 날짜에 "+diffDays+" 일 만큼 더한 날짜 = "+sdf.format(baseCal.getTime())); targetCal.add(Calendar.DAY_OF_MONTH, -(int)diffDays); System.out.println("비교 대상 날짜에 "+diffDays+" 일 만큼 뺀 날짜 = "+sdf.format(targetCal.getTime())); | cs |
위와 같이 Calendar.getInstance() 한 값을 기준으로 한 결과는 아래와 같습니다.
두 날짜간의 일수 차 = 132 일
----------------------------------------
기준 날짜 = 2018/01/11
비교 대상 날짜 = 2018/05/24
----------------------------------------
기준 날짜에 132 일 만큼 더한 날짜 = 2018/05/23
비교 대상 날짜에 132 일 만큼 뺀 날짜 = 2018/01/12
분명 133일 차이가 나야 하는데 132일 차이가 나는 것으로 결과 값이 잘못 나옵니다.
비교 대상이 잘못 되었기 때문이죠.
날짜 간의 비교를 해야 하는 경우라면 Calendar.getInstance() 대신 GregorianCalendar 를 이용하시거나 Calendar 클래스의 set 함수를 이용하여 원하는 날짜를 지정하는 것도 좋은 방법입니다.
▼ 도움이 되셨다면 로그인이 필요 없는 ▼
▼ 하트 클릭 한번 부탁 드립니다 ▼
감사합니다 :D
'Java' 카테고리의 다른 글
[ 자바 코딩 ] 자바 D-Day 구하기 (490) | 2018.01.30 |
---|---|
[ 자바 코딩 ] Enhanced For Loop (향상된 For 문) (1811) | 2018.01.16 |
[ 자바 코딩 ] 날짜 계산하기 (1548) | 2018.01.11 |
[ 자바 코딩 ] SimpleDateFormat 날짜 형식 지정하기 (4) | 2018.01.10 |
[ 자바 코딩 ] GregorianCalendar 을 이용하여 원하는 날짜, 시간 정보 셋팅하기 (513) | 2018.01.08 |