Date클래스로 날짜와 시간을 다룰 수있다. 하지만 이 클래스는 빈약했기 때문에 Calendar라는 새로운 클래스를 제공했다. 그 뒤 java.time패키지로 기존의 단점들을 보완하여 새로운 클래스들이 추가됐다.
Calendar클래스는 추상클래스이기 때문에 직접 인스턴스를 생성할 수 없고, 클래스 내부의 메소드를 이용해서 인스턴스를 얻어야한다.
Calendar cal = Calendar.getInstance();
getInstance()는 시스템의 국가와 지역설정을 확인하여 해당하는 역법에 대한 클래스를 반환한다. 태국을 제외한 국가에서는 그레고리력을 사용하기 때문에 GregorianCalendar클래스를 반환한다.
왜냐? 유지보수의 편의성을 위해 이런식으로 작성한다.
getInstance()는 static메소드이다.
Calendar클래스가 나오면서 Date클래스의 메소드는 대부분 "deprecated"(더 이상 사용되지 않음) 되었지만, 두 클래스간에 변환이 필요한 경우는 아래와 같이 할 수 있다.
// 1. Calendar -> Date 변환
Calendar cal = Calendar.getInstance();
Date d = new Date(cal.getTimeInMillis());
// 2. Date -> Calendar 변환
Date d = new Date();
Calendar cal = Calendar.getInstance();
cal.setTime(d);
get()
get()메소드로 원하는 필드의 값을 얻어올 수 있다.
Calendar today = Calendar.getInstance();
today.get(Calendar.DAY_OF_MONTH);
set()
set()메소드로 원하는 날짜나 시간으로 설정할 수 있다.
date1.set(2015,7,31);
month는 0~11이기 때문에 7이면 8월이다.
time1.set(Calendar.HOUR_OF_DAY, 10);
파라미터는 API를 참고하자
getTimeInMillis()
날짜를 ms단위로 반환한다. 예를들어 5초를 반환한다면 5000를 반환하기 때문에 1000으로 나눠주어야 초 단위로 얻을 수 있다.
일단위로 얻기 위해서는 (246060*1000)으로 나눠주어야한다.
date1.getTimeInMillis();
add()
date.add(Calendar.MONTH, -6);
원하는 필드의 값을 증가시키거나 감소시킬 수 있다.
roll()
date.roll(Calendar.DATE, 31);
roll()은 add()와 같은 기능이지만, 차이점은 다른 필드에는 영향을 미치지 않는다. 31만큼 증가시키면 다음달로 넘어가지 않고 다시 돌아온다.
getActualMaximum()
getActualMaximum(Calendar.DATE);
해당 월의 마지막 날을 알 수 있다.