Calendar와 Date
Date는 날짜와 시간을 다룰 목적으로 JDK1.0부터 제공되어온 클래스이다. Date 클래스는 기능이 부족했기 때문에, 그 다음 버전인 JDK1.1부터 Calendar라는 새로운 클래스를 제공하기 시작했다. Calendar는 Date보다는 훨씬 나았지만 몇 가지 단점들이 발견되어서 JDK1.8부터 'java.time패키지'로 기존의 단점들을 개선한 새로운 클래스들이 추가되었다.
Calendar와 GregorianCalendar
Calendar는 추상클래스이기 때문에 직접 객체를 생성할 수 없고, 메서드를 통해서 완전히 구현된 클래스의 인스턴스를 얻어야 한다.
Calendar cal = new Calendar(); // 에러!!! 추상클래스는 인스턴스를 생성할 수 없다.
Calendar cal = Calendar.getInstance(); // getInstance() 메서드는 Calendar 클래스를 구현한 클래스의 인스턴스를 반환한다.
Calendar를 상속받아 완전히 구현한 클래스로는 GregorianCalendar와 BuddhistCalendar가 있는데 getInstance()는 시스템의 국가와 지역설정을 확인해서 태국인 경우에는 BuddhistCalendar의 인스턴스를 반환하고, 그 외에는 GregorianCalendar의 인스턴스를 반환한다. (※ GregorianCalendar : Calendar 클래스의 하위 클래스)
인스턴스를 직접 생성해서 사용하지 않고 이처럼 메서드를 통해서 인스턴스를 반환받게 하는 이유는 최소한의 변경으로 프로그램이 동작할 수 있도록 하기 위한 것이다.
getInstance()메서드가 static인 이유는 메서드 내의 코드에서 인스턴스 변수를 사용하거나 인스턴스 메서드를 호출하지 않기 때문이며, 또 다른 이유는 getInstance()가 static이 아니라면 객체를 생성한 다음에 호출해야 하는데 Calendar는 추상클래스이기 때문에 객체를 생성할 수 없기 때문이다.
Date와 Calendar간의 변환
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);
Calendar 클래스의 주요 메서드
메서드 | 설명 | 반환 결과 |
getInstance() | 시스템의 현재 날짜와 시간으로 Calendar 인스턴스를 생성하여 반환한다. | Calendar |
get(int field) | 현재 객체의 주어진 값의 필드에 해당하는 상수 값을 반환한다.이 상수값은 Calendar 클래스의 상수중에 가진다. | int |
set(int field, int value) | 현재 객체의 특정 필드를 다른 값으로 설정한다. | void |
set(int year, int month, int date) | 현재 객체의 년, 월, 일 값을 다른 값으로 설정한다. | void |
set(int year, int month, int date, int hour, int minute, int second) | 현재 객체의 년, 월, 일, 시, 분, 초 값을 다른 값으로 설정한다. | void |
getTime() | 현재의 객체를 Date 객체로 변환한다. | Date |
setTime(Date date) | 현재 객체의 특정 필드를 다른 값으로 설정한다. | void |
getTimeInMillis() | 1/1000초 단위로 값을 반환한다. 일단위로 얻기 위해서는 24(시간)*60(분)*60(초)*1000 으로 나누어준다. |
long |
setTimeInMills(long mills) | 현재 객체를 1/1000초 단위의 주어진 매개변수 시간으로 설정한다. | void |
add(int field, int amount) | 지정한 필드의 값을 원하는 만큼 증가 또는 감소시킨다. | void |
roll(int field, int amount) | 지정한 필드의 값을 증가 또는 감소 시킬 수 있다. add메서드와의 차이점은 다른 필드에 영향을 미치지 않는다. |
void |
after(Object when) | 현재 객체가 when 이후이면 true 아니면 false를 리턴한다 | boolean |
before(Object when) | 현재 객체가 when 이전이면 true 아니면 false를 리턴한다. | boolean |
equals(Object obj) | 같은 날짜값인지 비교하여 true, false를 반환한다. | boolean |
getActualMaximum(int field) | 현재 객체의 특정 필드의 최대 값을 반환한다. | int |
getActualMinimum(int field) | 현재 객체의 특정 필드의 최소 값을 반환한다. | int |
clear(int field) | Calendar객체의 특정 필드를 초기화한다. | void |
toString() | Calendar 인스턴스에 저장된 날짜와 시간정보를 문자열로 변환하여 반환하는 메소드다. | String |
Calendar 클래스의 int형 상수들
Field(static int)
|
사용방법
|
설명
|
YEAR
|
Calendar.YEAR
|
현재 년도
|
MONTH
|
Calendar.MONTH
|
현재 월 (1월:0)
|
DATE
|
Calendar.DATE
|
현재 월의 날짜
|
WEEK_OF_YEAR
|
Calendar.WEEK_OF_YEAR
|
이 해의 몇 째 주
|
WEEK_OF_MONTH
|
Calendar.WEEK_OF_MONTH
|
이 달의 몇 째 주
|
DAY_OF_YEAR
|
Calendar.DAY_OF_YEAR
|
이 해의 몇 일
|
DAY_OF_MONTH
|
Calendar.DAY_OF_MONTH
|
이 달의 몇 일
|
DAY_OF_WEEK
|
Calendar.DAY_OF_WEEK
|
요일(1~7, 일요일:1)
|
DAY_OF_WEEK_IN_MONTH
|
Calendar.DAY_OF_WEEK_IN_MONTH
|
이 달의 몇 째 요일
|
AM_PM
|
Calendar.AM_PM |
오전 오후(오전:0, 오후:1)
|
HOUR
|
Calendar.HOUR
|
현재 시간 (12시간제)
|
HOUR_OF_DAY
|
Calendar.HOUR_OF_DAY
|
현재 시간 (24시간제)
|
MINUTE
|
Calendar.MINUTE
|
현재 분
|
SECOND
|
Calendar.SECOND
|
현재 초
|
MILLISECOND
|
Calendar.MILLISECOND
|
1000분의 1초(0~999) |
SimpleDateFormat
Date와 Calendar만으로 날짜 데이터를 원하는 형태로 다양하게 출력하는 것은 불편하고 복잡하다.
그러나 SimpleDateFormat을 사용하면 이러한 문제들이 간단히 해결된다.
SimpleDateFormat을 사용하는 방법은 먼저 원하는 출력형식의 패턴을 작성하여 SimpleDateFormat인스턴스를 생성한 다음, 출력하고자 하는 Date인스턴스를 가지고 format(Date d)를 호출하면 지정한 출력형식에 맞게 변환된 문자열을 얻게 된다.
Date today = new Date();
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
System.out.println(df.format(today)); // 2022-11-19
Calendar cal = Calendar.getInstance();
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd E");
System.out.println(df.format(cal.getTime())); // 2022-11-19 토
LocalDate와 LocalTime
LocalDate와 LocalTime은 java.time패키지의 가장 기본이 되는 클래스이다.
객체를 생성하는 방법은 현재의 날짜와 시간을 LocalDate와 LocalTime으로 각각 반환하는 now()와 지정된 날짜와 시간으로 LocalDate와 LocalTime객체를 생성하는 of()가 있다. 둘 다 static메서드이다.
LocalDate today = LocalDate.now();
LocalTime now = LocalTime.now();
LocalDate birthDate = LocalDate.of(2022, 11, 19);
LocalTime birthTime = LocalTime.of(17, 25, 20);
*LocalDate와 LocalTime의 필드의 값을 반환하는 메서드
클래스 | 메서드 | 설명 | 반환 결과 |
LocalDate | getYear() | 년도(1999) | int |
getMonthValue() | 월(12) | int | |
getMonth() | 월(DECEMBER) getMonth().getValue() = 12 | Month | |
getDayOfMonth() | 일(31) | int | |
getDayOfYear() | 같은 해의 1월 1일부터 몇번째 일(365) | int | |
getDayOfWeek() | 요일(FRIDAY) getDayOfWeek().getValue() = 5 | DayOfWeek | |
lengthOfMonth() | 같은 달의 총 일수(31) | int | |
lengthOfYear() | 같은 해의 총 일수(365), 윤년이면 366 | int | |
isLeapYear() | 윤년여부 확인(false) | boolean | |
LocalTime | getHour() | 시(23) | int |
getMinute() | 분(59) | int | |
getSecond() | 초(59) | int | |
getNano() | 나노초(0) | int |
* 자바의 정석을 읽고 정리한 내용입니다.
'DEVELOPMENT > JAVA' 카테고리의 다른 글
[JAVA] 연습문제 - 히스토그램(분포도) 만들기 (0) | 2022.11.21 |
---|---|
[JAVA] 연습문제 - 생일 D-Day 계산하기 (1) | 2022.11.20 |
[JAVA] 연습문제 - 이번 달 달력(calendar) 만들기 (0) | 2022.11.19 |
[JAVA] 예외처리 (0) | 2022.11.19 |
[JAVA] 객체지향 프로그래밍 (0) | 2022.11.13 |