Hello

Java 날짜와 시간, Calendar 클래스, Date와 Calendar간의 변환

by 볼빵빵오춘기

날짜와 시간

  • java.util.Date
    날짜와 시간을 다룰 목적으로 만들어진 클래스(JDK1.0)이며, Date의 메서드는 거의 deprecated되었지만, 여전히 쓰이고 있다.
  • java.util.Calendar
    Date클래스를 개선한 새로운 클래스(JDK1.1). 여전히 단점이 존재
  • java.time 패키지
    Date와 Calendar의 단점을 개선한 새로운 클래스들을 제공(JDK1.8)

Calendar 클래스

추상 클래스이므로 getInstance()를 통해 구현된 객체를 얻어야 한다.

 

Calendar 클래스 사용 방법

  • get()으로 날짜와 시간 필드 가져오기
더보기
Calendar cal = Calendar.getInstance(); // 현재 날짜와 시간으로 셋팅됨
int thisYear = cal.get(Calendar.Year); // 올해가 몇 년인지 알려줌
int lastDayofMonth = cal.getActualMaximum(Calendar.DATE)// 이 달의 마지막날을 알려줌

 

필드명 설명
YEAR
MONTH 월(0부터 시작)
WEEK_OF_YEAR
WEEK_OF_MONTH 그 달의 몇 번째 주
DATE
DAY_OF_MONTH 그 달의 몇 번째
DAY_OF_YEAR 그 해의 몇 번째 
DAY_OF_WEEK 요일
DAY_OF_WEEK_IN_MONTH
그 달의 몇 번째 요일

 

  • set()으로 날짜와 시간지정하기
더보기

⇒set()메서드는 오버로드되서 여러가지 사용가능

  • 날짜 지정하기
    월(MONTH)이 0부터 시작한다는 점에 주의! why? 0부터 시작하는 이유는 배열을 이용하기 때문에
  • 시간 지정하기
    ※ 시분초 세팅하는 메서드는 없어 따로따로 설정해야한다.
  • Calendar 객체의 모든 필드를 초기화하기 - clear()
    clear를 하면 1970년 1월 1일 00:00:00로 세팅된다.
     clear(int field)는 Calendat객체의 특정 필드를 초기화
  • add()는 특정 필드의 값을 증가 또는 감소(다른 필드에 영향O)
  • roll()은 특정필드의 값을 증가 또는 감소(다른 필드에 영향X)

 

예제

예제 코드1

더보기
import java.util.Calendar;

public class VarEx3 {
	public static void main(String[] args) {
		Calendar today = Calendar.getInstance();	
		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("요일(1~7, 1:일요일): " 
		 + today.get(Calendar.DAY_OF_WEEK)); // 1:일요일, 2:월요일, ... 7:토요일
	 	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));
 		// 천분의 1초를 시간으로 표시하기 위해 3600000으로 나누었다.(1시간 = 60 * 60초)
		System.out.println("TimeZone(-12~+12): " 
                    + (today.get(Calendar.ZONE_OFFSET)/(60*60*1000))); 
		System.out.println("이 달의 마지막 날: " 
            + today.getActualMaximum(Calendar.DATE) ); // 이 달의 마지막 일을 찾는다.
	}
}

예제 코드2 - 날짜 계산

더보기
import java.util.*;

public class VarEx3 {
	public static void main(String[] args) {
		// 요일은 1부터 시작하기 때문에, DAY_OF_WEEK[0]은 비워두었다.
		final String[] DAY_OF_WEEK = {"","일","월","화","수","목","금","토"};
 
		Calendar date1 = Calendar.getInstance();
		Calendar date2 = Calendar.getInstance();

		// month의 경우 0부터 시작하기 때문에 4월인 경우, 3로 지정해야한다.
		// date1.set(2019, Calendar.APRIL, 29);와 같이 할 수도 있다.
		date1.set(2022, 1, 1); // 2022년 4월 29일로 날짜를 설정한다. 
		System.out.println("date1은 "+ toString(date1) 
                  + DAY_OF_WEEK[date1.get(Calendar.DAY_OF_WEEK)]+"요일이고,");
		System.out.println("오늘(date2)은 " + toString(date2) 
                 + DAY_OF_WEEK[date2.get(Calendar.DAY_OF_WEEK)]+"요일입니다.");

	   // 두 날짜간의 차이를 얻으려면, getTimeInMillis() 천분의 일초 단위로 변환해야한다.
   	long difference = 
            (date2.getTimeInMillis() - date1.getTimeInMillis())/1000;
		System.out.println("그 날(date1)부터 지금(date2)까지 "
                                           + difference +"초가 지났습니다.");
		System.out.println("일(day)로 계산하면 "+ difference/(24*60*60) 
                                     +"일입니다."); // 1일 = 24 * 60 * 60
	}

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

예제 코드3 - 시간 계산1

더보기
import java.util.*;

public class VarEx3 {
	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);

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

		System.out.println("time1 :"+time1.get(Calendar.HOUR_OF_DAY)+"시 "
		+time1.get(Calendar.MINUTE)+"분 "+time1.get(Calendar.SECOND)+"초");
		System.out.println("time2 :"+time2.get(Calendar.HOUR_OF_DAY)+"시 "
		+time2.get(Calendar.MINUTE)+"분 "+time2.get(Calendar.SECOND)+"초");

		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++) { 
			  tmp += difference/TIME_UNIT[i] + TIME_UNIT_NAME[i]; 
			  difference %= TIME_UNIT[i];
		} 
		System.out.println("시분초로 변환하면 " + tmp + "입니다.");
	}
}

예제 코드4 - 시간 계산2

더보기
import java.util.*; 

class Ex10_5 { 
	public static void main(String[] args) { 
		if(args.length !=2) { 
			System.out.println("Usage : java Ex10_5 2019 9"); 
			return; 
		} 
		int year  = Integer.parseInt(args[0]); 
		int month = Integer.parseInt(args[1]); 
		int START_DAY_OF_WEEK = 0; 
		int END_DAY = 0; 

		Calendar sDay = Calendar.getInstance(); // 시작일 
		Calendar eDay = Calendar.getInstance(); // 끝일 

		// 월의 경우 0부터 11까지의 값을 가지므로 1을 빼주어야 한다. 
		// 예를 들어, 2019년 11월 1일은 sDay.set(2019, 10, 1);과 같이 해줘야 한다. 
  		sDay.set(year, month-1, 1);       
		eDay.set(year, month, 1); 

		// 다음달의 첫날(12월 1일)에서 하루를 빼면 현재달의 마지막 날(11월 30일)이 된다. 
		eDay.add(Calendar.DATE, -1);       

		// 첫 번째 요일이 무슨 요일인지 알아낸다. 
		START_DAY_OF_WEEK = sDay.get(Calendar.DAY_OF_WEEK); 

		// eDay에 지정된 날짜를 얻어온다. 
		END_DAY = eDay.get(Calendar.DATE); 

		System.out.println("      " + args[0] +"년 " + args[1] +"월"); 
		System.out.println(" SU MO TU WE TH FR SA"); 

		// 해당 월의 1일이 어느 요일인지에 따라서 공백을 출력한다. 
		// 만일 1일이 수요일이라면 공백을 세 번 찍는다.(일요일부터 시작) 
		for(int i=1; i < START_DAY_OF_WEEK; i++)  
			System.out.print("   "); 
            
		for(int i=1, n=START_DAY_OF_WEEK ; i <= END_DAY; i++, n++) { 
			System.out.print((i < 10)? "  "+i : " "+i ); 
			if(n%7==0) System.out.println(); 
		} 
	} 
}

예제 코드4

더보기
import java.util.*;

public class VarEx3 {
	public static void main(String[] args) {
		Calendar date = Calendar.getInstance();
		date.set(2019, 7, 31);	// 2019년 8월 31일

		System.out.println(toString(date));
		System.out.println("= 1일 후 =");
		date.add(Calendar.DATE, 1);
		System.out.println(toString(date));

		System.out.println("= 6달 전 =");
		date.add(Calendar.MONTH, -6);
		System.out.println(toString(date));

		System.out.println("= 31일 후(roll) =");
		date.roll(Calendar.DATE, 31);
		System.out.println(toString(date));

		System.out.println("= 31일 후(add) =");
		date.add(Calendar.DATE, 31);
		System.out.println(toString(date));
	}

	public static String toString(Calendar date) {
		return date.get(Calendar.YEAR)+"년 "+ (date.get(Calendar.MONTH)+1) 
                   +"월 " + date.get(Calendar.DATE) + "일";
	} // 보기편하게 오버로딩함.
}

⇒ 31일을 더했지만 day필드에만 영향을 주고 month필드에 영향을 주지않아 3월1일로 출력되었다.

예제 코드5

더보기
import java.util.*;

public class VarEx3 {
	public static void main(String[] args) { 

		int year  = 2022; 
		int month = 10; 
		int START_DAY_OF_WEEK = 0; 
		int END_DAY = 0; 

		Calendar sDay = Calendar.getInstance(); // 시작일 
		Calendar eDay = Calendar.getInstance(); // 끝일 

		// 월의 경우 0부터 11까지의 값을 가지므로 1을 빼주어야 한다. 
		// 예를 들어, 2019년 11월 1일은 sDay.set(2019, 10, 1);과 같이 해줘야 한다. 
  		sDay.set(year, month-1, 1);       
		eDay.set(year, month, 1); 

		// 다음달의 첫날(12월 1일)에서 하루를 빼면 현재달의 마지막 날(11월 30일)이 된다. 
		eDay.add(Calendar.DATE, -1);       

		// 첫 번째 요일이 무슨 요일인지 알아낸다. 
		START_DAY_OF_WEEK = sDay.get(Calendar.DAY_OF_WEEK); 

		// eDay에 지정된 날짜를 얻어온다. 
		END_DAY = eDay.get(Calendar.DATE); 

		System.out.println("      " + year +"년 " + month +"월"); 
		System.out.println(" SU MO TU WE TH FR SA"); 

		// 해당 월의 1일이 어느 요일인지에 따라서 공백을 출력한다. 
		// 만일 1일이 수요일이라면 공백을 세 번 찍는다.(일요일부터 시작) 
		for(int i=1; i < START_DAY_OF_WEEK; i++)  
			System.out.print("   "); 
            
		for(int i=1, n=START_DAY_OF_WEEK ; i <= END_DAY; i++, n++) { 
			System.out.print((i < 10)? "  "+i : " "+i ); 
			if(n%7==0) System.out.println(); 
		} 
	} 
}

 

Date와 Calendar간의 변환

Date의 메서드는 대부분 deprecated되었지만 여전히 사용하고 있다.

※ 자바는 하위호환성을 유지하면서 업그레이드 되고 있다. 그래서 발전속도가 느리지만 안전성이 있다.

블로그의 정보

Hello 춘기's world

볼빵빵오춘기

활동하기