JAVA/자바의 정석

[자바의 정석 - 기초편] 10. (2) Calendar 클래스 ( set, clear, add, roll ) / Date와 Calendar간의 변환

서영22 2023. 12. 6. 22:58

 Calendar 클래스 

- set()으로 날짜와 시간 지정하기

 

 

< 날짜 지정 >
월(Month)이 0부터 시작한다는 점에 주의!


Calendar date1 = Calendar.getInstance();
date1.set (2023, 7, 15);   // 2023년 8월 15일 (7월 아님)

// date1.set(Calendar.YEAR, 2023);
// date1.set(Calendar.MONTH, 7);
// date1.set(Calendar.DATE, 15);


< 시간 지정 >

Calendar time1 = Calendar.getInstance();
time1.set(Calendar.HOUR_OF_DAY, 10);  // time1을 10시 20분 30초로 설정
time1.set(Calendar.MINUTE, 20); 
time1.set(Calendar.SECOND, 10); 

 

 

 

< 예제 1 >

 

 

- DAY_OF_WEEK [ date1.get ( Calendar.DAY_OF_WEEK ) ] = DAY_OF_WEEK [ 2 ] = "월"

 

 

- 두 날짜간의 차이를 얻으려면? getTimeInMillis() 천분의 일초 단위로 변환

 

1. 날짜 ➔  초 바꾸어서 계산

 

  : ( date2.getTimeInMillis() - date1.getTimeInMillis() ) / 1000; 

  // 단위가 천분의 일초라 1000으로 나눠줘야 함

 

 

2. 초 ➔ 날짜로 다시 바꾸기

 

  : 계산한 값 / ( 24(시간) * 60(분) * 60(초) )

 

 

 

< 예제 2 >

 

 

- 두 시간간의 차이를 얻으려면? getTimeInMillis() 천분의 일초 단위로 변환

 

1. 시, 분, 초 ➔  천분의 일초단위로 바꾸어서 계산

 

  : Math.abs ( time2.getTimeInMillis() - time1.getTimeInMillis() ) / 1000; 

  // 어느게 더 큰지 몰라서 절대값 붙임 (Math.abs)

 

 

2. 초 ➔ 시, 분, 초로 다시 바꾸기

 

  : for (int i =0; i <TIME_UNIT.length; i++) {   //TIME_UNIT = { 3600, 60, 1}

         tmp += 계산한 값 / TIME_UNIT [ i ] + TIME_UNIT_NAME [ i ];   // __시간 __분 __초

         계산한 값 %= TIME_UNIT [ i ];

    }

 

 

 

 

- clear() : Calendar객체의 모든 필드를 초기화

Calendar dt = Calendar.getInstance();  // 현재시간

// Wed Dec 06 21:07:03 KST 2023
System.out.println( new Date( dt.getTimeInMillis() ) ); 

dt.clear();  // 모든 필드 초기화

// Tue Jan 01 01:01:01 KST 1970
System.out.println( new Date( dt.getTimeInMillis() ) ); 

 

 

 

 

- clear(int field) : Calendar객체의 특정 필드를 초기화

Calendar dt = Calendar.getInstance();  // 현재시간

// Wed Dec 06 21:07:03 KST 2023
System.out.println( new Date( dt.getTimeInMillis() ) ); 

dt.clear(Calendar.SECOND);              // 초를 초기화
dt.clear(Calendar.MINUTE);               // 분을 초기화
dt.clear(Calendar.HOUR_OF_DAY);  // 시간을 초기화
dt.clear(Calendar.HOUR);                  // 시간을 초기화

// Wed Dec 06 00:00:00 KST 2023
System.out.println( new Date( dt.getTimeInMillis() ) ); 

 

 

 

- add() : 특정 필드의 값을 증가 또는 감소 (다른 필드에 영향 O)

Calendar date = Calendar.getInstance();

date.clear();   // 모든 필드 초기화
date.set(2020, 7, 31)   // 2020년 8월 31일로 설정

date.add(Calendar.DATE, 1);   // DATE에 1을 더함 ➔ 2020년 9월 1일 (월 필드에 영향 줌)
date.add(Calendar.MONTH, -8);   // MONTH에서 8을 뺌 ➔ 2020년 8월 1일

 

 

 

 

- roll() : 특정 필드의 값을 증가 또는 감소 (다른 필드에 영향 X)

Calendar date = Calendar.getInstance();

date.clear();   // 모든 필드 초기화
date.set(2020, 7, 31)   // 2020년 8월 31일로 설정

date.roll(Calendar.DATE, 1);   // DATE에 1을 더함 ➔ 2020년 8월 1일 (날짜만 영향)
date.roll(Calendar.MONTH, -8);   // MONTH에서 8을 뺌 ➔ 2020년 12월 1일

 

 

 

< 예제 1 - roll()과 add() 비교 >

 

 

 

 

< 예제 2 - 달력 >

 

 

 

1. 말일 구하기 : 다음달 1일에서 하루 빼기

2. 1일의 요일 구하기

 

 

 

 Date와 Calendar간의 변환 

- Date의 메서드는 대부분 deprecated되었지만 여전히 사용

 

1. Calendar ➔ Date 변환

    Calendar cal = Calendar.getInstance();
         ...
    Date d = new Date (cal.getTimeInMillis());  // Date(long date)


2. Date ➔ Calendar 변환

    Date d = new Date();
         ...
    Calendar cal = Calendar.getInstance();
    cal.setTime(d);