Java

[Java] 날짜와 시간 (Calendar, Date)

씬프 2021. 5. 18. 09:45
반응형

Date는 날짜와 시간을 다루는 목적으로 사용된다. 하지만 Date 클래스는 날짜와 시간을 다루기에 기능이 부족했기 때문에 Calendar라는 새로운 클래스가 추가되었다. (1.8부터는 java.time 패키지로 Date와 Calendar로 부족한 기능을 개선한 새로운 클래스가 추가되었다.)

 

Calendar는 추상 클래스이기 때문에 직접 객체를 생성할 수 없다.

Calendar cal = new Calendar(); // Error

Calendar cal = Calendar.getInstance(); // OK

 

Date와 Calendar 간의 변환

// Calendar -> Date
Calendar cal = Calendar.getInstance();
Date d = new Date(cal.getTimeInMillis());

// Date -> Calendar
Date d = new Date();
// ...
Calendar cal = Calendar.getInstance();
cal.setTime(d);

 

Calendar 사용

Calendar를 통해 객체를 생성하면, get()을 이용해 원하는 필드의 값을 가져올 수 있다.

Calendar 내에 static 상수로 선언된 값을 파라미터로 받아 가져온다.

Calendar cal = Calendar.getInstance();
cal.get(Calendar.YEAR); // 년
cal.get(Calendar.MONTH); // 월 (0 ~ 11)
cal.get(Calendar.WEEK_OF_YEAR); // 몇주차 (한 해 기준)
cal.get(Calendar.WEEK_OF_MONTH); // 월 기준 몇주차
cal.get(Calendar.DATE); // 일
cal.get(Calendar.DAY_OF_YEAR); // 한 해 기준 몇 일째

위와 같이 Calendar에 정의된 static 상수를 파라미터로 get에 전달해 값을 받아올 수 있다.

주의할 것은 MONTH를 받아올 경우 1월~12월이 0~11로 표현된다는 것이다.

 

set() 메서드를 이용하면 원하는 시간으로 날짜를 설정할 수 있다.

Calendar cal = Calendar.getInstance();
cal.set(2015, 7, 15); // 2015년 8월 15일

두 날짜간의 연산도 가능하다.

Calendar date1 = Calendar.getInstance();
Calendar date2 = Calendar.getInstance();

date1.set(2015, 7, 15);

long differ = date2.getTimeInMillis() - date1.getTimeInMillis();
// 천분의 1초 단위로 변환한다. 초단위로 변경하고자 하면 1/1000으로 곱하여 3자리를 줄인다.

연산할 경우 천분의 일초 단위로 변경해야 한다. 

 

add() 메서드를 이용해 기준 시간에 연산이 가능하다.

Calendar cal = Calendar.getInstance();
cal.set(2015, 7, 31);

cal.add(Calendar.Date, 1); // 1일 후, 9월 1일
cal.add(Calendar.MONTH, -6); // 6달 전, 3월 1일
cal.roll(Calendar.Date, 31); // 31일 후, 3월 1일
cal.add(Calendar.Date, 31); // 31일 후, 4월 1일

add()와 roll() 메서드는 새로운 객체에 저장하지 않아도 바로 적용된다.

roll() 메서드는 add()와 다르게 연산 결과가 월 (달)을 넘어가지 않는다.

예외 상황이 있는데, 만약 1월 31일에서 roll() 메서드를 이용해 2월로 넘겼다면 2월 31일이 존재하지 않기 때문에 자동으로 2월 28일로 자동 변경된다. (add()도 적용)

'Java' 카테고리의 다른 글

[Java] java.time 패키지  (0) 2021.05.20
[Java] 형식화 (Format)  (0) 2021.05.19
[Java] String 클래스  (0) 2021.05.10
[Java] 생성자 (Constructor)  (0) 2021.05.07
[Java Spring] TestRestTemplate  (0) 2021.04.19