java.util.Calendar 클래스

Calendar 클래스는 자바에서 날짜와 시간에 관한 데이터를 손쉽게 처리할 수 있도록 제공하는 추상 클래스입니다.

이 클래스가 추상 클래스로 선언된 이유는 나라마다 사용하는 달력 체계가 조금씩 다를 수 있기 때문입니다.

 

이러한 Calendar 클래스에는 날짜와 시간을 처리하기 위한 다양한 필드와 메소드가 포함되어 있습니다.

Calendar 클래스의 모든 필드는 클래스 변수(static variable)이므로, 객체를 생성하지 않고도 바로 사용할 수 있습니다.

 

add() 메소드

add() 메소드는 전달된 Calendar 필드에서 일정 시간 만큼을 더하거나 빼줍니다.

즉, 특정 시간을 기준으로 일정 시간 전후의 날짜와 시간을 알 수 있습니다.

 

다음 예제는 add() 메소드를 이용하여 현재 시각에 120초를 더하는 예제입니다.

예제

Calendar time = Calendar.getInstance();

System.out.println(time.getTime());

 

time.add(Calendar.SECOND, 120);

System.out.println(time.getTime());

코딩연습 ▶

실행 결과

Thu Feb 16 08:57:29 KST 2017

Thu Feb 16 08:59:29 KST 2017

 

Calendar 클래스의 메소드는 현재 시각을 기준으로 동작하므로, 여러분의 결과는 위의 실행 결과와는 다를 것입니다.

before()와 after() 메소드

두 시간상의 전후 관계만을 알고 싶을 경우에는 before()와 after() 메소드를 사용할 수 있습니다.

before() 메소드는 현재 Calendar 인스턴스가 전달된 객체가 나타내는 시간보다 앞서는지를 판단합니다.

반대로 after() 메소드는 현재 Calendar 인스턴스가 전달된 객체가 나타내는 시간보다 나중인지를 판단합니다.

 

예제

Calendar time1 = Calendar.getInstance();

Calendar time2 = Calendar.getInstance();

Calendar time3 = Calendar.getInstance();

 

time2.set(1982, 2, 19);

time3.set(2020, 2, 19);

 

System.out.println(time1.before(time2));

System.out.println(time1.before(time3));

코딩연습 ▶

실행 결과

false

true


get() 메소드

get() 메소드는 전달된 Calendar 필드에 저장된 값을 반환합니다.

 

예제

Calendar time = Calendar.getInstance();

 

System.out.println(time.getTime());

System.out.println(time.get(Calendar.DAY_OF_WEEK));

System.out.println(time.get(Calendar.MONTH) + 1);

System.out.println(time.get(Calendar.DAY_OF_MONTH));

System.out.println(time.get(Calendar.HOUR_OF_DAY));

System.out.println(time.get(Calendar.MINUTE));

System.out.println(time.get(Calendar.SECOND));

System.out.println(time.get(Calendar.YEAR));

코딩연습 ▶

실행 결과

Thu Feb 16 08:57:44 KST 2017

5

2

16

8

57

44

2017


roll() 메소드

roll() 메소드는 전달된 Calendar 필드에서 일정 시간 만큼을 더하거나 빼줍니다.

하지만 add() 메소드와는 달리 다른 Calendar 필드에는 영향을 주지 않습니다.

즉, 계산 결과가 해당 필드의 최댓값이나 최솟값을 넘어가도 다른 필드에 영향을 주지 않습니다.

 

예제

Calendar time1 = Calendar.getInstance();

Calendar time2 = Calendar.getInstance();

System.out.println(time1.getTime());

 

time1.add(Calendar.SECOND, 60);

System.out.println(time1.getTime());

 

time2.roll(Calendar.SECOND, 60);

System.out.println(time2.getTime());

코딩연습 ▶

실행 결과

Thu Feb 16 08:58:23 KST 2017

Thu Feb 16 08:59:23 KST 2017

Thu Feb 16 08:58:23 KST 2017

 

위의 예제에서 add() 메소드를 사용하여 Calendar.SECOND 필드를 60초 증가시키면 결과적으로 Calendar.MINUTE 필드가 1 증가해야 합니다.

하지만 roll() 메소드를 사용하여 Calendar.SECOND 필드를 60초 증가시키면 Calendar.MINUTE 필드에는 아무런 영향을 주지 않습니다.

즉, Calendar.SECOND 필드만이 60초 증가하여 결과적으로 같은 값이 출력되게 됩니다.


set() 메소드

set() 메소드는 전달된 Calendar 필드를 특정 값으로 설정합니다.

 

다음 예제는 set() 메소드에 다양한 형태의 인수를 전달하여 시간을 설정하는 예제입니다.

예제

Calendar time = Calendar.getInstance();

System.out.println(time.getTime());

 

time.set(Calendar.YEAR, 2020);

System.out.println(time.getTime());

 

time.set(1982, 1, 19); // 1은 2월을 나타냄.

System.out.println(time.getTime());

 

time.set(1982, 1, 19, 12, 34, 56);

System.out.println(time.getTime());

코딩연습 ▶

실행 결과

Thu Feb 16 08:58:01 KST 2017

Sun Feb 16 08:58:01 KST 2020

Fri Feb 19 08:58:01 KST 1982

Fri Feb 19 12:34:56 KST 1982


대표적인 Calendar 메소드

Calendar 클래스의 메소드는 매우 다양하며, 그중에서 많이 사용되는 메소드는 다음과 같습니다.

메소드설명

void add(int field, int amount) 전달된 Calendar 필드에서 특정 시간 만큼을 더하거나 뺌.
boolean after(Object when) 현재 Calendar 인스턴스가 전달된 객체가 나타내는 시간보다 나중인지를 확인함.
boolean before(Object when) 현재 Calendar 인스턴스가 전달된 객체가 나타내는 시간보다 앞서는지를 확인함.
void clear(int field) 현재 Calendar 인스턴스의 모든 필드의 값을 undefined로 설정함.
int get(int field) 전달된 Calendar 필드에 저장된 값을 반환함.
static Calendar getInstance() 시스템의 현재 날짜와 시간으로 Calendar 인스턴스를 생성하여 반환함.
Date getTime() 현재 Calendar 인스턴스의 시간 정보를 나타내는 Date 인스턴스를 생성하여 반환함.
void roll(int field, int amount) 전달된 Calendar 필드에서 특정 시간 만큼을 더하거나 뺌.
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 필드를 특정 값으로 설정함.

코드 예시

import java.util.Calendar;
import java.util.Date;
import java.util.TimeZone;

public class MainClass {
    public static void main(String[] args) {

        Calendar cal = Calendar.getInstance();

        // 날짜 getter
        int year = cal.get(Calendar.YEAR);      // cal.get(1);
        int month = cal.get(Calendar.MONTH) + 1;    // cal.get(2);
            // 0~11월로 반환되기 때문임
        int day = cal.get(Calendar.DATE);       // cal.get(5);
        System.out.printf("year: %d month: %d day: %d \n", year, month, day);

        // 날짜 setter
        cal.set(Calendar.YEAR, 2026);
        cal.set(Calendar.MONTH, 2 -1);  // 2월
        cal.set(Calendar.DATE, 14);

        // 시간도 사용가능 (현재 시간으로 가져옴)
        int hour = cal.get(Calendar.HOUR);
        int minute = cal.get(Calendar.MINUTE);
        int second = cal.get(Calendar.SECOND);

        // 다시 대입
        year = cal.get(Calendar.YEAR);      // cal.get(1);
        month = cal.get(Calendar.MONTH) + 1;    // cal.get(2);
        // 0~11월로 반환되기 때문임
        day = cal.get(Calendar.DATE);       // cal.get(5);
        System.out.printf("year: %d month: %d day: %d\n", year, month, day);

        // 요일 (1~7) 일 ~토
        int weekday = cal.get(Calendar.DAY_OF_WEEK);
        // System.out.println("weekday: " + weekday); // 5 = 목요일
        switch (weekday) {
            case 1:
                System.out.println("일요일");
                break;
            case 2:
                System.out.println("월요일");
                break;
            case 3:
                System.out.println("화요일");
                break;
            case 4:
                System.out.println("수요일");
                break;
            case 5:
                System.out.println("목요일");
                break;
            case 6:
                System.out.println("금요일");
                break;
            case 7:
                System.out.println("토요일");
                break;
        }

        // 지정한 날짜의 마지막 날짜 ( 28, 29, 30, 31 )
        int lastDay = cal.getActualMaximum(Calendar.DAY_OF_MONTH);
        System.out.println("lastday: " + lastDay);


    }
}

 

참고자료: https://www.tcpschool.com/java/java_api_calendar

'Java' 카테고리의 다른 글

[Java] java.lang.Object 클래스  (1) 2025.01.09

+ Recent posts