본문 바로가기
JAVA BASE/DateTimeFormatting(포맷팅)

01. [자바] Calendar & Date

by staticClass 2020. 12. 29.

Calendar와 GregorianCalendar

Calendar는 추상클래스이기 때문에 메서드를 통해서 완전히 구현된 클래스의 인스턴스를 얻어야 한다.

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

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

Calendar를 상속받아 완전히 구현한 클래스로는 GregorianCalendar와 BuddhistCalendar가 있는데
getInstance()는 시스템의 국가 설정을 확을해 태국인 경우에만 BuddhistCalendar를 반환하고
그 외의 경우에는 GregorianCalendar를 반환한다.
메서드를 통해 인스턴스를 반환받는 이유는 최소한의 변경으로 프로그램이 동작하게 하기 위함이다.

한국에서 작성한 코드가 만약 아래와 같을 때 이 코드를 태국에서 실행하면

Calendar cal = new GregorianCalendar();

올바른 달력이 출력되지 않기 때문에 코드를 수정해야 하지만

아래와 같이 코드를 작성해 둔다면

Calendar cal = new getInstance();

어디에서 이 코드를 실행하던지 그 나라에 맞는 달력이 생성된다.

Date와 Calendar간의 변환

Calendar클래스가 추가되면서 Data클래스 대부분의 메서드가 'deprecated(비추천)'이 되어 잘 사용되지 않는다.
하지만 여전히 Date를 필요로 하는 메서드들이 있기 때문에 Calendar와 Date를 서로 변환해야 하는 일이 있다.

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

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

메소드와 field (Calendar 사용법)

Calendar cal = Calendar.getInstance();
cal.get(Calendar.YEAR);   // 현재 년도

위의 코드를 보면 get 메서드에 YEAR필드를 이용하여 현재 년도를 불러오고 있다.
Calendar클래스는 이런식으로 데이터를 불러오게 되는데 몇가지의 메서드와 필드에 대해 알아보자.

 

메소드

 메소드 / 설명 사용 예
int get(int field) Calendar  cal = Calendar.getInstance();
cal.get(Calendar.Hour);
원하는 필드의 값을 얻어올 수 있다.
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)
Calendar  cal = Calendar.getInstance();
cal.set(Calendar.HOUR, 1);
cal.set(2020, 1, 1);


날짜와 시간을 원하는 값으로 변경할 수 있다.
void add(int field, int amount) Calendar  cal = Calendar.getInstance();
cal.add(Calendar.DATE, 31);
cal.add(Calendar.DATE, -31);

지정한 필드의 값을 증가 또는 감소 시킬 수 있다.
(DATE(일) 필드의 값을 31만큼 증가 시키면
MONTH(월) 필드의 값이 1 증가함
날짜 개념에 맞게 알아서 주변 필드가 맞춰짐)
void roll(int field, int amount) Calendar  cal = Calendar.getInstance();
cal.roll(Calendar.DATE, 31);
지정한 필드의 값을 증가 또는 감소 시킬 수 있다.
(DATE(일)필드의 값을 31만큼 증가 시켜도
MONTH(월)필드의 값은 변경 없음
지정한 필드만 수정됨
)
int getMaximum(int field) Calendar  cal = Calendar.getInstance();
cal.getMaximum(Calendar.SECOND);

매개변수 field의 가장 큰 값을 반환한다

 

필드(field)

필드(field) 설명
Calendar.YEAR 이 해의 연도
Calendar.MONTH 월(0~11, 0: 1월)
Calendar.WEEK_OF_YEAR 이 해의 몇 째 주
Calendar.WEEK_OF_MONTH 이 달의 몇 째 주
Calendar.DATE 이 달의 몇 일
Calendar.DAY_OF_MONTH 이 달의 몇 일
Calendar.DAY_OF_YEAR 이 해의 몇 일
Calendar.DAY_OF_WEEK 요일(1~7 1:일요일)
Calendar.DAY_OF_WEEK_IN_MONTH 이 달의 몇 째 요일
Calendar.AM_PM 오전(0), 오후(1)
Calendar.HOUR 시간(0~11)
Calendar.HOUR_OF_DAY 시간(0~23)
Calendar.MINUTE 분(0~59)
Calendar.SECOND 초(0~59)
Calendar.MILLISECOND 1000분의 1초(0~999)

 

Date와 Calenar만으로는 다양한 형태로 출력하는게 복잡하다.

하지만 SimpleDateFormat을 사용하면 간단해진다.

2020/12/30 - [JAVA BASE/DateTimeFormatting] - 03. [자바] SimpleDateFormat

 

댓글