본문 바로가기

Java

날짜와 시간

출처 - Java의 정석 기초편 (남궁 성)

 

 

1. 날짜와 시간

- java.util.Date (JDK1.0): 빈약

- java.util.Calendar (JDK1.1): 개선, 여전히 단점 존재

- java.time패키지 (JDK1.8): 개선, 날짜와 시간 따로 다루기 가능

 

 

2. Calendar클래스

- 추상클래스: 객체 생성 불가 → getInstance() 메서드를 통해 구현된 클래스의 인스턴스 반환(현재 시스템의 날짜와 시간)

- getInstance()는 태국 제외 GregorianCalendar의 인스턴스 반환

 

Calendar cal = new calendar(); // 에러!!!
Calendar cal = Calendar.getInstance(); // 추상화

 

 

3. get()

- Calendar클래스에 정의된 필드 사용

- get(Calendar.MONTH): 0~11월, 0:1월

- get(Calendar.DAY_OF_WEEK): 1~7요일, 1:일요일

 

Calendar today = Calendar.getInstance(); // 1. 캘린더 객체 생성, 현재 날짜와 시간으로 세팅
System.out.println(today.get(Calendar.YEAR)); // 2. get() 캘린더 정의 필드 사용
// set() 설정도 가능
int lastDayOfMonth = today.getActualMaximum(Calendar.DATE) // 이 달의 마지막 

YEAR // 년
MONTH // 월(0~11, 0:1월)
WEEK_OF_YEAR // 그 해의 몇 번째 주
WEEK_OF_MONTH // 그 달의 몇 번째 주
DATE // 일
DAY_OF_MONTH // 그 달의 몇 번째 일
DAY_OF_YEAR // 그 해의 몇 번째 일
DAY_OF_WEEK // 요일(1~7, 1:일요일)
DAY_OF_WEEK_IN_MONTH // 그 달의 몇 번째 요일

HOUR // 시간(0~11)
HOUR_OF_DAY // 시간(0~23)
MINUTE // 분
SECOND // 초
MILLISECOND // 1000분의 1초
ZONE_OFFSET // GMT 기준 시차
AM_PM // 오전:0, 오후:1

 

 

4. set()

- 날짜와 시간 지정(년월일, 시분초)

- getTimeInMillis(): 1/1000초 단위로 값을 반환 → 초단위 1000으로 나누고, 일단위 24(시간)*60(분)*60(초)*1000으로 나눔

 

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 date1 = Calendar.getInstance();
Calendar date2 = Calendar.getInstance();

date1.set(2021, 7, 15); // 2021년 8월 15일로 설정

long difference = (date2.getTimeInMillis() - date1.getTimeInMilliis());
// 두 날짜 간 차이는 1/1000 초 단위로 변환해야 함

 

 

5. clear()

- clear(): Calendar 객체의 모든 필드 초기화

- clear(int field): Calendar 객체의 특정 필드 초기화

- 현재시간 쓸 것 아니면: 객체 생성 → clear() 모든 필드  초기화 → set() 설정

 

Calendar dt = Calendar.getInstance(); // 현재 시간
dt.clear(); // 초기화 (1970년 1월 1일 00:00:00)

 

 

6. add(), roll()

- add(int field, int amount): 특정 필드의 값을 증가 또는 감소(다른 필드에 영향 O)

- roll(int field, int amount): 특정 필드의 값을 증가 또는 감소(다른 필드에 영향 X)

 

Calendar date = Calendar.getInstace();
date.clear();
date.set(2022.7.31); // 8/31

date.add(Calendar.DATE, 1); // 9/1
date.roll(Calendar.DATE, 31); // 9/2 → 일필드가 월필드에 영향 X

 

 

7. Date와 Calendar 간 변환

- 대부분의 Date 메서드 사용하지 않을 것을 권장(deprecated)

 

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)