본문 바로가기

프로그래밍/JAVA

[ JAVA ] Calendar와 Date

1. Calendar와 GregorianCalendar

Calendar추상클래스이기 때문에 직접 객체를 생성할 수 없고, 메서드를 통해 완전히 구현된 클래스의 인스턴스를 얻어야 한다.
▶ Calendar를 상속받아 완전히 구현한 클래스로는 GregorianCalendarBuddhistCalendar가 있다.
getInstance()는 시스템의 국가와 지역설정을 확인해서 태국인 경우에는 BuddhistCalendar의 인스턴스를 반환하고, 그 외에는 GregorianCalendar의 인스턴스를 반환한다.
Calendar cal = new Calendar(); // 에러! 추상클래스는 인스턴스를 생성할 수 없다.

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

2. Date와 Calendar 간의 변환

1. Calendar를 Date로 변환
   Calendar cal = Calendar.getInstance();
           ...
   Date d = new Date(cal.getTiemInMillis()); // Date(long date)
   // 또는
   Date d = cal.getTime(); // Calendar 객체의 날짜와 같은 날짜를 나타내는 Date 객체를 리턴한다.
   
2. Date를 Calendar로 변환
   Date d = new Date();
           ...
   Calendar cal = Calendar.getInstance();
   cal.setTime(d);

⭐️ Calendar의 주요 상수

상수 설명
static int YEAR 현재 년도
static int MONTH 현재 월 (값의 범위 0~11, 0이면 1월이고, 11이면 12월)
static int WEEK_OF_YEAR 현재 년도의 몇 째 주
static int WEEK_OF_MONTH 이 달의 몇 째 주
static int DATE 이 달의 몇 일
static int DAY_OF_MONTH 이 달의 몇 일
static int DAY_OF_YEAR 이 해의 몇 일
static int DAY_OF_WEEK 요일 (값의 범위 1~7, 1이면 일요일)
static int DAY_OF_WEEK_IN_MONTH 이 달의 몇 째 요일
static int AM_PM 오전_오후 (0이면 오전, 1이면 오후)
static int HOUR 시간 (0~11)
static int HOUR_OF_DAY 시간(0~23)
static int MINUTE 분(0~59)
static int SECOND 초(0~59)
static int MILLISECOND 1000분의 1초 (0~999)
static int ZONE_OFFSET GMT 기준 시차(-12~+12)

⭐️ Calendar의 주요 메서드

메서드 설명 예시
static Calendar getInstance() 현재 날짜와 시간 정보를 가진 Calendar 객체를 생성한다. Calendar today = Calendar.getInstance();
int get(int field) 필드에 해당하는 값을 반환한다. 필드는 Calendar 클래스에 정의된 static 상수이다. today.get(Calendar.YEAR);
today.get(Calendar.MONTH);
today.get(Calendar.DATE);
long getTimeInMillis() 객체의 시간을 1/1000초 단위로 변경하여 반환한다. today.getTiemInMillis();
void set(int field, int value)

void set(int year, int month, int date)

void set(int year, int month, int date, int hourOfDay, int minute)


void set (int year, int month, int date, int hourOfDay, int minute, int second)

날짜와 시간을 원하는 값으로 변경할 수 있다. today.set(2022, 10, 10); // 2022년 11월 11일로 날짜를 설정

today.set(Calendar.HOUR_OF_DAY, 20);
today.set(Calendar.MINUTE, 30);
today.set(Calendar.SECOND, 10);
// 20시 30분 10초로 설정
void add(int field, int amount) 지정한 필드의 값을 원하는 만큼 증가 또는 감소 시킬 수 있다.
(예: 날짜필드의 값을 31만큼 증가시키면 다음 달로 넘어가므로 월 필드의 값도 1 증가)
Calendar date = Calendar.getInstance();
date.set(2022, 7, 31);
date.add(Calendar.DATE, 31);
void roll(int field, int amount) 지정한 필드의 값을 증가 또는 감소시킬 수 있다. 다른 필드에 영향을 미치지 않는다.
(예: 날짜필드의 값을 31만큼 증가시키면 월 필드의 값은 변하지 않고 일 필드의 값만 바뀐다.
-> 일 필드가 말일일 때, 월 필드를 변경하면 일 필드에 영향을 미칠 수 있다.
)
Calendar date = Calendar.getInstance();
date.set(2022, 7, 31);
date.roll(Calendar.DATE, 31);
boolean after(Object when) when과 비교하여 현재 날짜 이후이면 true, 아니면 false를 반환한다. Calendar date1 = Calendar.getInstance();
Calendar date2 = Calendar.getInstance();

date1.set(2021, 12, 10);
date2.set(2022, 12, 10);

date1.after(date2);
boolean before(Object when) when과 비교하여 현재 날짜 이전이면 true, 아니면 false를 반환한다. Calendar date1 = Calendar.getInstance();
Calendar date2 = Calendar.getInstance();


date1.set(2021, 12, 10);
date2.set(2022, 12, 10);


date1.before(date2);
int getActualMaximum(int field) 현재 객체의 특정 필드의 최대 값을 반환한다. Calendar date = Calendar.getInstance();
date.set(2022, 12 , 12);
date.getActualMaximum(Calendar.DAY_OF_MONTH);
-> 해당 월 마지막 날짜

예제1) 두 날짜간의 차이 구하기

예제2) add 메서드와 roll 메서드의 차이