본문 바로가기
멀티캠퍼스 풀스택 과정/Java의 정석

자바의 정석7-1 날짜와 시간클래스(Calendar, Date)

by 이쟝 2022. 1. 8.

Calendar와 Date 

java.util.Date

- 날짜와 시간을 다룰 목적으로 만들어진 클래스(JDK1.0)

- Date 메서드는 거의 deprecated(앞으로 사용x)되었지만, 여전히 쓰이고 있다.

 

java.util.Calendar

- Date클래스를 개선한 새로운 클래스(JDK1.1) 여전히 단점이 존재

 

java.time패키지

- DateCalendar의 단점을 개선한 새로운 클래스들을 제공(JDK1.8)

- DateCalendar의 단점은 항상 날짜와 시간을 같이 쓰는 것!


Calendar클래스

- 추상 클래스이므로 직접 객체를 생성할 수 없고, getInstance( )를 통해 구현된 객체를 얻어야 한다.

 

Calendar cal = new Calendar();  // 에러!!! 추상클래스는 인스턴스를 생성할 수 없다.

// OK, getInstance()메서드는 Calendar클래스를 구현한 클래스의 인스턴스를 반환한다. 
Calendar cal = Calendar.getInstance();

 

더보기
더보기
더보기

- Calendar 상속받아 완전히 구현한 클래스 -> GregorianCalendar(): 시스템의 국가와 지역설정을 확인해 GregorianCalendar 인스턴스를 반환(그레고리력)

 

-> (Calendar cal = new GregorianCalendar( ); 이렇게 특정 인스턴스를 생성하도록 프로그램이 작성되어 있다면, 다른 종류의 인스턴스를 필요로 하는 경우에는 코드를 변경해야 함.) 최소한의 변경을 하기위해서 getInstance( )를 사용함


get( ) 메서드

- get()으로 날짜와 시간 필드 가져오기 – int get(int field)

 

Calendar cal = Calendar.getInstance();    // 현재 날짜와 시간이 입력된 객체 생성!

int thisYear = cal.get(Calendar.YEAR);   
// get메서드로 년도를 가져와서 thisYear에 넣기

int thisMonth = cal.get(Calendar.MONTH)+1; 
// get메서드로 달을 가져와서 thisMonth에 넣기(달은 0부터 시작, 결과값에서 +1해주기)

System.out.println(thisYear);
System.out.println(thisMonth);

Calendar에 정의된 필드

1) 날짜 관련 필드

 

 

2) 시간 관련 필드

 


DateCalendar간의 변환

- Date의 메서드는 대부분 deprecated(사용하지 않을 것을 권장)되었지만 여전히 사용

 

 


예제1) Calendar 객체를 getInstance( )로 생성하고 get( )을 사용해서 필드를 출력(날짜 계산)

 

import java.util.Calendar;

public class Ex10_1 {
	public static void main(String[] args) {
		// 기본적으로 현재날짜와 시간으로 설정된다.
		// 날짜 필드
		Calendar today = Calendar.getInstance();  // Calendar 객체를 생성
		System.out.println("이 해의 년도: " + today.get(Calendar.YEAR));
		System.out.println("월(0~11, 0:1월): " + today.get(Calendar.MONTH));
		
		System.out.println("이 해의 몇 째 주: " + today.get(Calendar.WEEK_OF_YEAR));
		System.out.println("이 달의 몇 째 주: " + today.get(Calendar.WEEK_OF_MONTH));
		
		// DATE와 DAY_OF_MONTH는 같음
		System.out.println("이 달의 몇 일: " + today.get(Calendar.DATE));
		System.out.println("이 달의 몇 일: " + today.get(Calendar.DAY_OF_MONTH));
		System.out.println("이 해의 몇 일: " + today.get(Calendar.DAY_OF_YEAR));
		System.out.println("이 달의 마지막날: " + today.getActualMaximum(Calendar.DATE));
		
		// 요일
		System.out.println("요일(1~7, 1:일요일): " + today.get(Calendar.DAY_OF_WEEK));
		System.out.println("이 달의 몇 째 요일: " + today.get(Calendar.DAY_OF_WEEK_IN_MONTH));
		
		// 시간 필드
		System.out.println("오전_오후(0:오전, 1:오후): " + today.get(Calendar.AM_PM));
		System.out.println("시간(0~11): " + today.get(Calendar.HOUR));
		System.out.println("시간(0~23): " + today.get(Calendar.HOUR_OF_DAY));
		System.out.println("분(0~59): " + today.get(Calendar.MINUTE));
		System.out.println("초(0~59): " + today.get(Calendar.SECOND));
		System.out.println("1000분의 1초(0~999): " + today.get(Calendar.MILLISECOND));
		System.out.println("TimeZone(-12~+12): " + today.get(Calendar.ZONE_OFFSET));
	}
}

예제2) Calendar 객체를 getInstance( )로 생성하고 set( )을 사용해서 날짜와 시간을 지정

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

 

 

-> , , / , ,

 

- 날짜 지정하는 방법. (MONTH) 0부터 시작한다는 점에 주의

 

 

-> , , 일을 한 번에 설정할 수도 있고, 나눠서 설정할 수 있음

 

- 시간 지정하는 방법

 

 

-> 시간은 하나씩 다 따로 설정해줘야 함


예제3) Calendar 객체를 getInstance( )로 생성하고 set( )을 사용해서 날짜와 시간을 지정한 다음 시간의 차이를 출력

-> 두 개의 시간 데이터로부터 초 단위로 차이를 구한 다음, 시분초로 바꿔 출력하는 예제

 

import java.util.Calendar;

public class Ex10_3 {

	public static void main(String[] args) {
		final int[] TIME_UNIT = {3600, 60, 1}; // 큰 단위를 앞에 놓는다. 
		final String[] TIME_UNIT_NAME = {"시간", "분", "초"};
		
		Calendar time1 = Calendar.getInstance();
		Calendar time2 = Calendar.getInstance();
		
		time1.set(Calendar.HOUR_OF_DAY,10); // time1을 10시 20분 30초로 설정
		time1.set(Calendar.MINUTE,20);
		time1.set(Calendar.SECOND,30);
		
		System.out.println("time1: "+time1.get(Calendar.HOUR_OF_DAY)+"시 "
				+ time1.get(Calendar.MINUTE)+"분 " + time1.get(Calendar.SECOND)+"초");
		
		time2.set(Calendar.HOUR_OF_DAY,20);  // time2를 20시 30분 10초로 설정
		time2.set(Calendar.MINUTE,30);
		time2.set(Calendar.SECOND,10);
		
		System.out.println("time2: "+time2.get(Calendar.HOUR_OF_DAY)+"시 "
				+ time2.get(Calendar.MINUTE)+"분 "+time2.get(Calendar.SECOND)+"초");
		
		// time2가 더 크면 음수가 나올 수도 있기 때문에 절대값 메서드로 감쌌다.(1) 시분초 -> 초
		long difference = Math.abs(time2.getTimeInMillis() - time1.getTimeInMillis())/1000;
		System.out.println("time1과 time2의 차이는 " + difference + "초 입니다.");
		
		String tmp = "";    
		for(int i=0;i<TIME_UNIT.length;i++) { // (2) ms -> 시분초
			tmp += difference/TIME_UNIT[i] + TIME_UNIT_NAME[i];  // 거스름돈 동전 개수구하기와 동일
			difference %= TIME_UNIT[i];
		}
		System.out.println("시분초로 변환하면 " + tmp + "입니다.");
	}
}

 

더보기
더보기
더보기

(1) 차이계산하기: 시분초 –> 초 단위로 바꾸고 출력하면 차이가 나온다. 초를 다시 시분초로 바꾸면 날짜가 나올 수 있다. (getTimeInMillis( ) 시분초 -> ms) 1= 1000ms

(2)

ms -> 시분초로 변환

ex) i = 0;

tmp = 36580(difference) / 3600(TIME_UNIT[0] + “시간”(TIME_UNIT_NAME[0]) -> tmp = 10시간

   difference = 36580 % 3600(TIME_UNIT[0]); ->. difference = 580

 


예제4)

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

 

Calendar cal = Calendar.getInstance();
Date date = new Date();

//System.out.println(cal.getTimeInMillis()); // 1641615338380
System.out.println(date);   // Sat Jan 08 13:17:23 KST 2022
System.out.println(new Date(cal.getTimeInMillis())); // Sat Jan 08 13:17:23 KST 2022
//위의 두코드는 동일함(Calendar객체는 생성되면 현재시간으로 초기화)
		
cal.clear();  // 모든 필드를 초기화
System.out.println(new Date(cal.getTimeInMillis()));// Thu Jan 01 00:00:00 KST 1970

 

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

 

Calendar cal = Calendar.getInstance(); 
System.out.println(new Date(cal.getTimeInMillis())); // Sat Jan 08 13:26:03 KST 2022
				
//cal.set(Calendar.SECOND,0), cal.clear(cal.SECOND)와 동일
cal.clear(Calendar.SECOND); // 초를 초기화
cal.clear(Calendar.MINUTE); // 분을 초기화

//HOUR은 오전과 오후로 나눔 0-12 / HOUR_OF_DAY는 24시간
//시간을 초기화
//cal.clear(Calendar.HOUR);         // Sat Jan 08 13:00:00 KST 2022
//cal.clear(Calendar.HOUR_OF_DAY);  // Sat Jan 08 13:00:00 KST 2022
//cal.set(Calendar.HOUR, 0);        // Sat Jan 08 12:00:00 KST 2022
//cal.set(Calendar.HOUR_OF_DAY,0);  // Sat Jan 08 00:00:00 KST 2022

 

더보기
더보기
더보기

-> 만약 두 Calendar 객체를 생성하면 둘의 시간에는 오차가 있기 때문에 꼭 clear로 초기화를 해준다..!


예제5)

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

-> 양수말고 음수도 사용가능

 

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

 

import java.util.Calendar;

public class EX10_4 {
	public static void main(String[] args) {
		
		Calendar cal = Calendar.getInstance();
		cal.set(2019, 7, 31); // 2019년 8월 31일
	
		// toString 메서드 따로 생성
		System.out.println(toString(cal));  // 2019년8월31일
		System.out.println("= 1일 후 =");    
		cal.add(Calendar.DATE, 1);
		System.out.println(toString(cal));  // 2019년9월1일
		
		System.out.println("= 6달 전 =");
		cal.add(Calendar.MONTH, -6);
		System.out.println(toString(cal));  // 2019년3월1일
		
		// add()와 달리 roll은 다른 필드에 영향을 주지 않음
		System.out.println("= 31일 후 =(roll)"); 
		cal.roll(Calendar.DATE, 31);		// date만 1일로 변하고 month는 그대로
		System.out.println(toString(cal));  // 2019년3월1일

		System.out.println("= 31일 후 =(add)");
		cal.add(Calendar.DATE, 31); 	    // 31일을 더해서 월도 함께 4월로 바뀜!
		System.out.println(toString(cal));  // 2019년4월1일

	}
	private static String toString(Calendar cal) {
		return cal.get(Calendar.YEAR) + "년" + (cal.get(Calendar.MONTH)+1) + "월" + 
				cal.get(Calendar.DATE) + "일";
	}
}

 

 

https://everysmallstep.tistory.com/80?category=1045245