본문 바로가기

Java

Java 날짜와 시간, Calendar 클래스

 

1. 날짜와 시간

1) java.util.Date

날짜와 시간을 다룰 목적으로 만들어진 클래스(1995년 말, JDK 1.0)

Date의 메서드는 거의 deprecated 되었지만 여전히 쓰이고 있음(뿌리가 깊다보니..)

 

2) java.util.Calendar

Date클래스를 개선한 새로운 클래스(1997년 JDK 1.1)이지만 여전히 단점 존재

 

3) java.time패키지

Date와 Calender의 단점을 개선한 새로운 클래스 제공(2014년 JDK 1.8)

- Date와 Calender는 날짜와 시간이 묶여서 처리되고, 불변되는 등의 여러가지 단점을 개선하였음

 

 👉🏻 단점이 있음에도 불구하고 오랜기간 사용되어왔기 때문에 Date와 Calendar 알아두는 정도로 공부

 

2. Calendar 클래스

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

import java.util.*;

class Ex10_1 {
	public static void main(String[] args) 
	{   // get으로 날짜와 시간 필드 가져오기 int get(int field)
		// 기본적으로 현재 날짜와 시간으로 설정됨
		Calendar today = Calendar.getInstance();	// 현재 날짜와 시간으로 세팅됨 
		System.out.println("이 해의 연도: " + today.get(Calendar.YEAR));
		System.out.println("월(0~11, 0:1월): " + today.get(Calendar.MONTH)); // 0: 1월, 1: 2월, ... 12월: 11
	  	System.out.println("이 해의 몇 째 주: " + today.get(Calendar.WEEK_OF_YEAR)); 
		System.out.println("이 달의 몇 째 주: " + today.get(Calendar.WEEK_OF_MONTH)); 
	 	System.out.println("이 달의 몇 일: " + today.get(Calendar.DATE)); // DATE와 DAY_OF_MONTH는 같음
	 	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));
		System.out.println("TimeZone(-12~+12): " + (today.get(Calendar.ZONE_OFFSET)/(60*60*1000))); // GMT 기준 시차(힌국은 +9) 천분의 1초를 시간으로 표시하기 위해 3600000으로 나누기(1시간 = 60 * 60초)
		System.out.println("이 달의 마지막 날: " + today.getActualMaximum(Calendar.DATE) ); // 이 달의 마지막 날 
	}
}

 

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

		// 현재 일시
		Calendar dt = Calendar.getInstance();
		System.out.println(new Date(dt.getTimeInMillis()));
		
		// 모든 필드 초기화, 초기화 값 = Thu Jan 01 00:00:00 KST 1970
		dt.clear();
		System.out.println(new Date(dt.getTimeInMillis()));

 

- add(int field, int amount)는 특정 필드의 값을 증가 또는 감소(다른 필드에 영향을 줌)

- roll(int field, int amount)은 특정 필드의 값을 증가 또는 감소(다른필드에 영향을 주지 않음)

import java.util.*;

class Ex10_4 {
	public static void main(String[] args) {
		Calendar date = Calendar.getInstance();
		date.set(2022, 11, 30);	// 2022년 12월 30일

		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));

		//add()와 다르게 roll()은 다른 필드에 영향을 주지 않음
		System.out.println("= 31일 후(roll) =");
		date.roll(Calendar.DATE, 31);
		System.out.println(toString(date));

		System.out.println("= 1일 전(add) =");
		date.add(Calendar.DATE, -1);
		System.out.println(toString(date));
		
		// roll()의 예외, 일 필드가 말일 일 때 영향을 미침(5월 31일 -1월, 4월 30일 일 필드와 월 필드 모두 변경됨)
		System.out.println("= 31일 후(roll) =");
		date.roll(Calendar.MONTH, -1);
		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) + "일";
	}
}

 

3. Date와 Calendar 간 변환

- Calendar가 새로 추가되면서 Date의 대부분의 메서드가 'deprecated'되었음

- 하지만 필요한 상황이 생길 수 있으므로 변환하는 방법을 알아두자

// 1. Calendar -> Date
Calendar cal - Calendear.getInstance();
...
Date d = new Date(cal.getTimeInMillis()); // Date(long date)

// 2. Date -> Calendar
Date d = new Date();
...
Calendar cal = Calendar.getInstance();
cal.setTime(d)