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


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


몇월 몇일 부터 몇월 몇일 까지 몇일 차이인지 구하거나 특정일 까지 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 등의 프로그래밍 언어를 소개 합니다.

,




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


이번에 포스팅 할 내용은 특정 날짜에 원하는 날 만큼 + / - 하는 방법입니다. 


오늘 부터 한달 후는 몇 일 일까요? 

연인과 사귄 날로 부터 100일째 되는 날이 언제일까요? 


이런것들을 구하는 방법들에 대해 알아 보겠습니다. 



■ 오늘로 부터 한달 후는 몇일 일까?


1
2
3
4
5
6
7
SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");
 
Calendar cal = Calendar.getInstance();
System.out.println("오늘 날짜: "+sdf.format(cal.getTime()));
        
cal.add(Calendar.MONTH, 1);
System.out.println("오늘로 부터 한달 후: "+sdf.format(cal.getTime()));
cs


Calendar 클래스에서 제공하는 add 라는 함수를 사용했습니다. 


결과는 아래와 같습니다.


오늘 날짜: 2018/01/10

오늘로 부터 한달 후: 2018/02/10



■ 연인과 1일차인 2018년 1월 1일로 부터 100일째는?

1
2
3
4
5
6
7
SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");
 
Calendar cal = new GregorianCalendar(2018, Calendar.JANUARY, 1);
System.out.println("연인과 1일차: "+sdf.format(cal.getTime()));
        
cal.add(Calendar.DAY_OF_MONTH, 100);
System.out.println("연인과 사귄지 100일째: "+sdf.format(cal.getTime()));
cs

달을 구할때와 같이 이번에도 Calendar 클래스의 add 함수를 사용 했습니다. 

단, 이번에는 Calendar.MONTH 대신 Calendar.DAY_OF_MONTH 에 100일을 더했습니다. 


결과는 아래와 같습니다. 


연인과 1일차: 2018/01/01

연인과 사귄지 100일째: 2018/04/11



■ 기준일로 부터 이전 날짜 구하기


위 두가지 예제는 앞으로 몇달 후 또는 몇일 후 를 구하는 방식이었습니다. 

반대로 지나간 날짜를 구하는 방법은 어떻게 될까요? 


아주 간단합니다. 

입력 값을 양수 값이 아닌 음수 값으로 넣어 주면 됩니다. 


두번째 예제 결과 값인 2018년 4월 11일로 부터 101일 전이 몇일 인지 구해 보겠습니다. 


1
2
3
4
5
6
7
SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");
 
Calendar cal = new GregorianCalendar(2018, Calendar.APRIL, 11);
System.out.println("기준일: "+sdf.format(cal.getTime()));
        
cal.add(Calendar.DAY_OF_MONTH, -101);
System.out.println("기준일로 부터 101전: "+sdf.format(cal.getTime()));
cs


add 함수를 사용 했지만 음수 값을 입력했습니다. 

결과는 아래와 같습니다. 


기준일: 2018/04/11

기준일로 부터 101전: 2017/12/31



■ 오늘로 부터 한달 열흘 후 날짜 구하기


이번에는 몇 일 또는 몇 달이 아닌 한달 + 10일 이라는 값을 구하려고 합니다. 

어떻게 하면 될까요? 

눈치 빠르신 분들은 벌써 답을 찾으셨을 것 같습니다. 


한달을 add 한 값에 다시 10일을 add 하면 되겠죠? 

코드는 아래와 같습니다. 


1
2
3
4
5
6
7
8
SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");
 
Calendar cal = Calendar.getInstance();
System.out.println("오늘 날짜: "+sdf.format(cal.getTime()));
        
cal.add(Calendar.MONTH, 1);
cal.add(Calendar.DAY_OF_MONTH, 10);
System.out.println("오늘로 부터 한달 열흘 후: "+sdf.format(cal.getTime()));
cs


결과 값은 아래와 같습니다. 


오늘 날짜: 2018/01/10

오늘로 부터 한달 열흘 후: 2018/02/20



위와 같은 방식으로 여러 조합을 이용하여 원하는 값을 쉽게 가져 올 수 있습니다. 


잘 이용 하시길 바랍니다 :)



 도움이 되셨다면 로그인이 필요 없는 

▼ 하트 클릭 한번 부탁 드립니다 

감사합니다 :D



블로그 이미지

쉬운코딩이최고

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

,




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


앞서 Calendar 객체를 이용하여 원하는 날짜 및 시간 정보를 셋팅하고 이를 프린트 해봤는데요. 

이번에는 조금 다른 방법으로 데이터를 셋팅해 보겠습니다. 


GregorianCalendar 클래스를 이용하는 방법입니다. 

(참고) https://docs.oracle.com/javase/7/docs/api/java/util/GregorianCalendar.html




■ GregorianCalendar 클래스 생성자 


GregorianCalendar 클래스는 몇가지 생성자를 제공하고 있습니다. 그중 우리가 관심있는 몇 가지만 살펴 보겠습니다. 


public GregorianCalendar(int year,
                 int month,
                 int dayOfMonth)

GregorianCalendar 생성자 중 가장 기본으로 생각 됩니다. 세가지 파라미터 값을 입력 받으며 년,월,일 을 표기 합니다. 

GregorianCalendar(년, 월, 일) 형태의 입력을 받습니다. 


public GregorianCalendar(int year,
                 int month,
                 int dayOfMonth,
                 int hourOfDay,
                 int minute)

GregorianCalendar(년도, 월, 일, 시, 분) 형식으로 입력 하는 생성자를 제공하고 있습니다. 


public GregorianCalendar(int year,
                 int month,
                 int dayOfMonth,
                 int hourOfDay,
                 int minute,
                 int second)

GregorianCalendar(년도, 월, 일, 시, 분, 초) 형식으로 입력 하는 생성자를 제공하고 있습니다. 



■ GregorianCalendar 예제


Calendar cal = new GregorianCalendar(2018,0,5,1,13,56);

위에서 정리한 생성자 중 세번째 생성자를 사용하여 초단위까지 입력을 했습니다. 

입력 값은 2018년 1월 5일 1시 13분 56 초 입니다. 


물론 1월 (Calendar.MONTH == 0) 을 설정하는데 왜 0 을 입력 했냐는 질문을 안하시리라 믿습니다 :)


위 코드는 아래와 같이 변경 가능합니다. 

Calendar cal = new GregorianCalendar(2018,Calendar.JANUARY,5,1,13,56);

이제 설정한 값을 앞선 포스팅과 같이 프린트 해보겠습니다. 


int year = cal.get(Calendar.YEAR);
int month = cal.get(Calendar.MONTH) + 1;
int date = cal.get(Calendar.DATE);
int dayOfWeek = cal.get(Calendar.DAY_OF_WEEK);

int hour = cal.get(Calendar.HOUR);
int minute = cal.get(Calendar.MINUTE);
int second = cal.get(Calendar.SECOND);

String korDayOfWeek = "";
switch (dayOfWeek) {
case 1:
korDayOfWeek = "일";
break;
case 2:
korDayOfWeek = "월";
break;
case 3:
korDayOfWeek = "화";
break;
case 4:
korDayOfWeek = "수";
break;
case 5:
korDayOfWeek = "목";
break;
case 6:
korDayOfWeek = "금";
break;
case 7:
korDayOfWeek = "토";
break;
}

System.out.println(year+"."+month+"."+date+"("+korDayOfWeek+") "+hour+":"+minute+":"+second);

결과는 아래와 같이 리턴 됩니다. 


2018.1.5(금) 1:13:56


cal.set(Calendar.YEAR, 2018);
cal.set(Calendar.MONTH, Calendar.JANUARY);
cal.set(Calendar.DATE, 5);

cal.set(Calendar.HOUR, 1);
cal.set(Calendar.MINUTE, 13);
cal.set(Calendar.SECOND, 56);

위와 같이 일일이 셋팅 해주는 것 보다는 GregorianCalendar 객체를 이용하는 것이 더욱 편하겠죠? ^^




 도움이 되셨다면 로그인이 필요 없는 

▼ 하트 클릭 한번 부탁 드립니다 

감사합니다 :D




블로그 이미지

쉬운코딩이최고

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

,




바로 전 포스팅에서 Calendar 객체를 이용하여 현재 날짜, 요일, 시간 정보를 가져 오는 방법에 대해 정리 했습니다. 


이번에는 원하는 날짜 및 시간 정보 등을 입력 하고 이를 다시 사용 하는 방법에 대해 정리 하겠습니다. 


String startDate = "20180505083000";

위와 같이 날짜 정보를 startDate 라는 변수에 String 형으로 입력 했습니다. 

2018년 5월 5일 08시 30분 00초 를 정의 한 텍스트 입니다. 


역시 Calender 객체를 이용하기 위해서는 Calendar.getInstance() 를 사용 합니다. 

Calendar cal = Calendar.getInstance();

위와 같은 상태에서 cal 정보를 확인 하면 현재시간 정보가 나옵니다. (이전 포스팅 참조)


여기에 원하는 startDate 정보를 대입해 줍니다. 

cal.set(Calendar.YEAR, Integer.parseInt(startDate.substring(0, 4)));
cal.set(Calendar.MONTH, Integer.parseInt(startDate.substring(4, 6)) - 1);
cal.set(Calendar.DATE, Integer.parseInt(startDate.substring(6, 8)));

cal.set(Calendar.HOUR, Integer.parseInt(startDate.substring(8, 10)));
cal.set(Calendar.MINUTE, Integer.parseInt(startDate.substring(10, 12)));
cal.set(Calendar.SECOND, Integer.parseInt(startDate.substring(12, 14)));

각각의 Calendar 객체 상수값에 대입하는데요. 여기서 한가지 주의 할 점은 Calendar.MONTH 에는 5 가 그대로 입력 되면 안된다는 것입니다. Calendar.MONTH 값이 5일 경우 이는 6월을 의미 하므로 -1 을 한 값을 입력해 주어야 합니다. (이전 포스팅 참조)


이제 cal 에는 현재 날짜 정보를 대신하여 2018년 5월 5일 08시 30분 00초 라는 정보가 셋팅 되었습니다. 

확인은 아래와 같이 해보겠습니다. 

int year = cal.get(Calendar.YEAR);
int month = cal.get(Calendar.MONTH) + 1;
int date = cal.get(Calendar.DATE);
int dayOfWeek = cal.get(Calendar.DAY_OF_WEEK);

int hour = cal.get(Calendar.HOUR);
int minute = cal.get(Calendar.MINUTE);
int second = cal.get(Calendar.SECOND);

String korDayOfWeek = "";
switch (dayOfWeek) {
case 1:
korDayOfWeek = "일";
break;
case 2:
korDayOfWeek = "월";
break;
case 3:
korDayOfWeek = "화";
break;
case 4:
korDayOfWeek = "수";
break;
case 5:
korDayOfWeek = "목";
break;
case 6:
korDayOfWeek = "금";
break;
case 7:
korDayOfWeek = "토";
break;
}

System.out.println(year+"."+month+"."+date+"("+korDayOfWeek+") "+hour+":"+minute+":"+second);

dayOfWeek 값을 별도 입력 하지 않아도 2018년 5월 5일 날짜 정보를 조회하여 요일 정보를 가져 옵니다. 

위 코드를 실행 하면 아래와 같은 결과 값을 리턴합니다. 


2018.5.5(토) 8:30:0


2018년 5월 5일이 토요일이네요 ^^


String startDate = "20180319083000";

날짜를 2018년 3월 19일로 설정해봤습니다. 

위 코드를 그대로 실행 시키면 아래와 같은 결과 값을 리턴합니다. 


2018.3.19(월) 8:30:0


2018년 3월 19일이 월요일이 맞습니다. 잘 동작하네요 ^^


이번 예제와 같이 날짜정보를 String 형으로 제공 하는 경우는 보통 API 호출 또는 전문 호출등을 통해 특정 날짜 정보를 가져 올 경우 형식은 정해져 있으나 (ex. yyyyMMddHHmmss) 어떤 값이 올지 모를 경우에 많이 사용합니다. 


만약 정확한 날짜 정보를 알고 있다면 아래와 같이 직접 입력 하는 방법도 사용 가능합니다. 

cal.set(Calendar.YEAR, 2018);
cal.set(Calendar.MONTH, Calendar.MAY);
cal.set(Calendar.DATE, 5);

cal.set(Calendar.HOUR, 8);
cal.set(Calendar.MINUTE, 30);
cal.set(Calendar.SECOND, 0);

처음 방식과 다르게 Calendar.MONTH 에 Calendar.MAY 라는 값을 셋팅 했습니다. 5월이라는 상수 값을 그대로 입력 했으므로 처음과 달리 -1 을 하거나 할 필요가 없습니다. 


물론 결과는 위와 동일 합니다 :)



 도움이 되셨다면 로그인이 필요 없는 

▼ 하트 클릭 한번 부탁 드립니다 

감사합니다 :D




블로그 이미지

쉬운코딩이최고

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

,