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
댓글