'자바 두 날짜 비교'에 해당되는 글 1건




안녕하세요. 제임스 입니다. 


이번에는 두 날짜 간의 차이 구하는 방법에 대해 정리 해보겠습니다. 


몇월 몇일 부터 몇월 몇일 까지 몇일 차이인지 구하거나 특정일 까지 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




블로그 이미지

쉬운코딩이최고

Android, Java, jsp, Linux 등의 프로그래밍 언어를 소개 합니다.

,