Java 날짜 - java.util.Calendar 클래스

Java로 일자/관련의 작업을 수행하려면, Calendar 클래스(java.util 패키지)를 사용한다.

날짜/시간

Calendar 클래스의 인스턴스를 생성하려면 (new 연산자가 아닌) getInstance 메서드를 사용한다.

Calendar cal = Calendar.getInstance();

getTime 메서드

getTime 메서드는 캘린더의 날짜/시간을 받아온다.

public final Date getTime()

getTime 메서드를 이용하는 것으로 캘린더로부터 현재의 시각을 Date 객체(java.util 패키지)로서 받아올 수 있다.

package com.devkuma.basic.datetime;

import java.util.Calendar;

public class CalTime {
    public static void main(String[] args) {
        Calendar cal = Calendar.getInstance();
        System.out.println(cal.getTime());  // 결과 : Mon Sep 05 11:34:21 KST 2022
    }
}

실행 결과:

Mon Sep 05 11:35:30 KST 2022

get 메서드

get 메서드는 날짜/시간 요소 받아온다.

public int get(int field)
  field: 취득할 날짜/시간 필드

달력에서 특정 날짜/시간 요소를 가져오려면 get 메서드를 사용한다. get 메서드에는 받아오고 싶은 일자/시각 요소에 대응하여 다음과 같은 정수를 지정한다.

Calendar 클래스에서 사용할 수 있는 주요 상수(날짜/시간 요소)

상수 개요
YEAR
MONTH 월(0~11)
DATE
DAY_OF_YEAR 그 해의 며칠째
WEEK_OF_MONTH 그 달의 몇 주째
WEEK_OF_YEAR 그 해의 몇 주째
HOUR_OF_DAY 시(24시간)
HOUR 시(12시간)
AM_PM 오전(0), 오후(1)
MINUTE
SECOND
MILLISECOND 밀리초
DAY_OF_WEEK 요일

DAY_OF_WEEK(요일)는 반환 값으로 상수로 SUNDAY, MONDAY, TUESDAY, WEDNESDAY, TURSDAY, FRIDAY, SATURDAY를 반환한다.

ppackage com.devkuma.basic.datetime;

import java.util.Calendar;

public class CalGet {
    public static void main(String[] args) {
        Calendar cal = Calendar.getInstance();
        System.out.println(cal.get(Calendar.YEAR)); // 결과: 2022
        System.out.println(cal.get(Calendar.MONTH)); // 결과: 8
        System.out.println(cal.get(Calendar.DATE)); // 결과: 5
    }
}

실행 결과:

2022
8
5

set 메서드

set 메서드 날짜/시간 요소 설정한다.

public final void set(int year, int month, int date [,int hour, int minute])
public void set(int field, int value)
  year: 
  month: 
  date: 
  hour: 
  minute:
  field: 설정할 날짜/시간 필드
  value: 인수 field에 설정할 

달력의 시간/날짜 요소를 설정하려면 set 메서드를 사용한다.
연월일시분을 모와서 지정하려면, 첫번째 구문을 사용하면 된다.
특정 날짜/시간 요소(예: 연도)를 지정하려면. 두번째 구문에서 날짜/시간 필드 및 값 집합으로 지정한다. 인수 field에 지정할 수 있는 값에 대해서는 위에 get 메서드의 테이블을 참조하여라.

package com.devkuma.basic.datetime;

import java.util.Calendar;

public class CalSet {

    public static void main(String[] args) {
        Calendar cal1 = Calendar.getInstance();
        cal1.set(2022, 8, 1, 15, 20, 10);
        System.out.println(cal1.getTime()); // 결과: Thu Sep 01 15:20:10 KST 2022

        Calendar cal2 = Calendar.getInstance();
        cal2.set(Calendar.YEAR, 2022);
        System.out.println(cal2.getTime()); // 결과: Mon Sep 05 11:41:55 KST 2022
    }
}

실행 결과:

Thu Sep 01 15:20:10 KST 2022
Mon Sep 05 11:41:55 KST 2022

add 메서드

add 메서드는 날짜/시간 요소에 대해 추가/감산을 한다.

public abstract void add(int field, int amount)
  field: 연산할 날짜/시간 필드
  amount: 증감분

현재 날짜/시간 요소를 기준으로 값을 더하거나 빼려면 add 메서드를 사용한다. add 메서드에서는 지정된 일자/시각 요소(get 메서드의 테이블을 참조)에 대해서 인수 amount의 값만 가산한다. 인수 amount가 음수이면 감산을 한다.

CalAdd.java

package com.devkuma.basic.datetime;

import java.util.Calendar;

public class CalAdd {
    public static void main(String[] args) {
        Calendar cal = Calendar.getInstance();
        System.out.println(cal.getTime());  // 결과: Mon Sep 05 11:43:44 KST 2022

        cal.add(Calendar.YEAR, 3);
        System.out.println(cal.getTime());  // 결과: Fri Sep 05 11:43:44 KST 2025

        cal.add(Calendar.YEAR, -5);
        System.out.println(cal.getTime());  // 결과: Sat Sep 05 11:43:44 KST 2020
    }
}

실행 결과:

Mon Sep 05 11:43:44 KST 2022
Fri Sep 05 11:43:44 KST 2025
Sat Sep 05 11:43:44 KST 2020

roll 메서드

roll 메서드는 날짜/시간 요소 가산/감산(롤링)을 한다.

public void roll(int field, int amount)
public abstract void roll(int field, boolean up)
  field: 가산/감산하는 일자/시간 필드(get 메서드의 표를 참조)
  amount: 증감분
  up: 증가할까

roll 메서드도 add 메서드와 동일하게 날짜/시간 요소를 가산/감산한다. 그러나 add 메서드와 다른 점음 다음과 같다.

  1. 다른 필드에 영향을 미치지 않는다.
    17:59에 1분을 더하면, add 메서드는 시간이 늘어나 18:00이 된다. 그러나, roll 메서드는 올라가지 않고, 17:00이 된다.

  2. 두 번째 인수에 부울 값을 지정할 수 있다.
    두 번째 인수에 true를 지정하면 지정된 날짜/시간 필드를 증가시키고 false를 지정하면 감소한다.

package com.devkuma.basic.datetime;

import java.util.Calendar;

public class CalRoll {
    public static void main(String[] args) {
        Calendar cal = Calendar.getInstance();
        System.out.println(cal.getTime());  // 결과: Mon Sep 05 11:46:43 KST 2022

        cal.roll(Calendar.MINUTE, true);
        System.out.println(cal.getTime());  // 결과: Mon Sep 05 11:47:43 KST 2022
    }
}

실행 결과:

Mon Sep 05 11:46:43 KST 2022
Mon Sep 05 11:47:43 KST 2022

clear 메서드

clear 메서드는 날짜/시간 요소 지운다.

public final void clear([int field])
  field: 지울 시간/날짜 필드

clear 메서드를 사용하면, 지정된 일자/시각 요소(get 메서드의 테이블을 참조)의 값을 클리어 한다. 지워진 필드에는 필드에 따라 결정된 초기 값이 설정된다.

인수 필드가 생략되면 모든 필드가 지워진다. 그렇게 되면 “1970/01/01 00:00:00"이 된다.

package com.devkuma.basic.datetime;

import java.util.Calendar;

public class CalClear {
    public static void main(String[] args) {
        Calendar cal = Calendar.getInstance();
        System.out.println(cal.getTime());  // 결과: Mon Sep 05 11:52:06 KST 2022

        cal.clear(Calendar.SECOND);
        System.out.println(cal.getTime());  // 결과: Mon Sep 05 11:52:00 KST 2022

        cal.clear();
        System.out.println(cal.getTime());  // 결과: Thu Jan 01 00:00:00 KST 1970
    }
}

실행 결과:

Mon Sep 05 11:52:06 KST 2022
Mon Sep 05 11:52:00 KST 2022
Thu Jan 01 00:00:00 KST 1970

before/equals/after 메서드

before/equals/after 메서드 날짜 비교 한다.

public boolean after(Object when)
public boolean before(Object when)
public boolean equals(Object when)
  when: 비교할 캘린더

캘린더의 크기를 비교하려면 before/equals/after 메서드를 사용한다. before 메서드는 비교하는 캘린더가 현재의 캘린더보다 전인 경우에, equals 메서드는 동일한 경우에, after 메서드는 나중인 경우에 각각 true를 반환한다.

CalEquals.java

package com.devkuma.basic.datetime;

import java.util.Calendar;

public class CalEquals {
    public static void main(String[] args) {
        Calendar cal = Calendar.getInstance();
        Calendar cal2 = Calendar.getInstance();
        cal.set(Calendar.YEAR, 2020);
        cal2.set(Calendar.YEAR, 2015);
        System.out.println(cal.before(cal2));   // 결과: false
        System.out.println(cal.equals(cal2));   // 결과: false
        System.out.println(cal.after(cal2));    // 결과: true
    }
}

실행 결과:

false
false
true

캘린더가 동일하다는 것은 날짜/시간 값이 동일할 뿐만 아니라, 타임 존이나 로케일 등의 캘린더 설정도 동일한 것을 의미한다. 다른 캘린더에 대해 equals 메서드는 false를 반환한다.