Date와 Calendar 클래스
- JDK 1.0 버전에서는 날짜를 처리하기 위해 Date 클래스를 사용했다.
- JDK 1.1 버전부터는 Calendar 클래스를 사용하여 날짜 처리 작업을 하도록 변경되었다.
- Date 클래스의 대부분 메소드들 deprecated 되었다.
- 현재 Date클래스의 생성자는 두 개만 사용이 가능하고 나머지는 deprecated 되었다.
- 먼저 Date 클래스의 생성자를 알아보자
Date 클래스의 생성자
생성자 | 설명 |
Date() | 객체가 생성된 시간을 갖는 Date 객체를 생성 |
Date(long date) | 매개 변수로 넘어온 long 타입을 갖는 Date 객체를 생성 |
- Date(long date) 중 long date 값은 UTC 시간으로 현재 시간을 long 타입으로 리턴해주는 System.currentTimeMillis() 메소드 호출시 리턴되는 시간과 같다.
- UTC 시간은 System 클래스에 속해있고 Univeral time 기준으로 1970년 1월 1일 00:00 부터 지금까지의 밀리초 단위의 차이를 출력하게 된다. 밀리초란 1/1,000 초이다. 1,000 밀리초를 다르게 표현하면 1,000ms라고 표시하고 1초와 같다.
- Date 클래스의 메소드들은 deprecated 된 것이 대부분이며 사용 가능한 메소드들 중 쓸 만한 것은 getTime() 메소드와 setTime() 메소드이다
- Date 클래스의 메소드를 알아보자
Date 메소드
리턴 타입 | 메소드 이름 및 매개 변수 | 설명 |
long | getTime() | Date 객체의 시간을 long 타입으로 리턴 |
void | setTime() | Date 객체의 시간을 매개 변수로 받은 시간으로 변경 |
- Date 클래스의 예제를 알아보자
import java.util.Date;
public class DateSample {
public static void main(String[] args) {
Date date = new Date();
System.out.println(date);
long time = date.getTime();
System.out.println(time);
date.setTime(0);
System.out.println(date);
}
}
- Date객체 생성 후 getTime() 메소드로 현재시간을 확인하고, setTime() 메소드로 long타입의 시간이 0일 때 Date 객체의 시간을 확인하는 예제이다
- 실행 결과는 다음과 같다. 결과는 현재 시간에 따라 달라진다
Mon Nov 02 12:00:39 KST 2020
1604286039588
Thu Jan 01 09:00:00 KST 1970
- 3번째 줄의 결과에 09:00:00으로 되어있는데 이것은 한국은 GMT 시간상+9시간이기 때문에 09시로 출력이 된다
- 예를 들어) 오늘이 11월 2일이라고 했을 때 1주일 후는 11월 9일이 되겠지만 11월 28일일 경우에 1주일 후가 며칠인지 확인하려면 계산하는 것이 쉽지 않다. 그래서 , 제공되는 것이 Calendar 클래스이다.
- Calendar 클래스는 다음과 같이 선언되어 있다
public abstract class Calendar
implements Serializable, Cloneable, Comparable<Calendar>
- Calendar 클래스는 추상 클래스이며 생성자들이 protected로 선언되어 있다.
- 즉, 이 클래스를 확장해서 구현하지 않으면 생성자로 객체를 만들 수 없다
- 객체를 생성할 때 사용하는 메소드는 getInstance()를 사용하면 된다. 4가지의 메소드가 있으며 살펴보도록 하자
객체 생성 메소드 | 설명 |
getInstance() | 기본 객체 생성 메소드, 모든 값은 기본값이며, 현재 시간으로 지정된 Calendar 객체를 생성 |
getInstance(Locale aLocale) | 지정된 지역의 Calendar 객체를 생성 |
getInstance(TimeZone zone) | 지정된 타임존의 Calendar 객체를 생성 |
getInstance(TimeZone zone, Locale aLocale) | 지정된 타임존과 지역의 Calendar객체를 생성 |
- Locale 클래스와 TimeZone 클래스는 모두 java.util 패키지에 선언되어있다.
- Locale 클래스는 지역에 대한 정보를 담는다
- TimeZone 클래스는 시간대를 나타내고 처리하기 위해서 사용된다.
- TimeZone 클래스도 abstract 클래스이기 때문에 편하게 사용하려면 SimpleTimeZone 클래스를 사용하면 된다.
- getInstance() 메소드를 사용해서 Calendar 객체를 생성할 수도 있지만 TimeZone과 같이 JDK 기본 API에는 GregorianCalendar 클래스를 제공한다
- 일반적으로 GregorianCalendar 객체를 생성해서 사용하는 것을 권장한다.
- 예제를 보기 전 Calendar 클래스의 API를 먼저 확인해 보는 것도 좋다고 생각된다
- Calendar 클래스의 상수들을 살펴보면
Calendar 클래스의 상수들
- 날짜 계산 관련
- ERA, YEAR, MONTH, WEEK_OF_YEAR, WEEK_OF_MONTH, DATE, DAY_OF_MONTH, DAY_OF_YEAR, DAY_OF_WEEK,DAY_OF_WEEK_IN_MONTH
- 시간 관련
- AM_PM, HOUR, HOUR_OF_DAY, MINUTE, SECOND, MILLISECOND, ZONE_OFFSET, DST_OFFSET, AM, PM
- 요일 관련
- SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY
- 월 관련
- JANUARY, FEBRUARY, MARCH, APRIL, MAY, JUNE, JULY, AUGUST, SEPTEMBER, OCTOBER, NOVEMBER, DECEMBER
- 기타
- FIELD_COUNT, ALL_STYLES, SHORT, LONG
import java.util.Calendar;
import java.util.GregorianCalendar;
public class CalendarSample {
public static void main(String[] args) {
Calendar cal = Calendar.getInstance();
Calendar greCal = new GregorianCalendar();
int year = greCal.get(Calendar.YEAR);
int month = greCal.get(Calendar.MONTH);
int date = greCal.get(Calendar.DAY_OF_MONTH);
System.out.println(year+"/"+month+"/"+date);
}
}
// 결과
// 2020/10/2
- 이 예제의 결과는 2020년 11월 02일 기준의 결과이다
- 왜 11이 아니고 10이 나왔는지는 1월이 0부터 시작해서 11월이 10인 것이다.
다음 포스팅은 Date클래스와 Calendar 클래스가 Deprecated 된 이유를 포스팅하겠습니다
2020/11/02 - [Java/개념] - Java 에서 Date, Calendar클래스가 왜 Deprecated됐는지?
'Java > 개념' 카테고리의 다른 글
Java 8 LocalDateTime vs Instant 어떤 상황에서 쓰는게 적합한가? (0) | 2022.08.09 |
---|---|
Java 메모리 최적화가 어떻게 되는지 과정 (0) | 2021.02.25 |
JVM 동적 클래스 로딩 (0) | 2021.02.24 |
[Java] Java 8에 추가된 LocalDate, LocalTime, LocalDateTime (0) | 2020.11.02 |
[Java] Date, Calendar클래스가 왜 Deprecated됐는지? (0) | 2020.11.02 |