Java Calendar, Date, Time

Calendar

GregorianCalendar

Calendar는 다음과 같이 인스턴스를 가져온다.

Calendar cal = Calendar.getInstance(); // getInstance() 메서드는 Calendar 클래스를 구현한 클래스의 인스턴스를 반환한다.

Calendar는 추상클래스이기 때문에 직접 객체를 생성할 수 없고, 메서드를 통해서 완전히 구현된 클래스의 인스턴스를 얻어야 한다.

getInstance() 메서드가 static인 이유

  • 메서드 내의 코드에서 인스턴스 변수를 사용하거나 인스턴스 메서드를 호출하지 않기 때문.
  • static이 아니라면 객체를 생성한 다음에 호출해야 하는데 Calendar는 추상클래스이기 때문에 객체를 생성할 수 없다.

Calendar를 상속받아 완전히 구현한 클래스로는 GregorianCalendar와 BuddhistCalendar가 있는데 태국을 제외한 나머지 국가에서는 GregorianCalendar를 사용하면 된다.

Calendar cal = new GregorianCalendar();

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 필드 값

int get(int field); 함수를 사용하여 원하는 필드의 값을 가져올 수 있다.

Calendar today = Calendar.getInstance();
System.out.println(today.get(Calendar.YEAR));
System.out.println(today.get(Calendar.MONTH)); // 값의 범위: 0 ~ 11
System.out.println(today.get(Calendar.DATE));
System.out.println(today.get(Calendar.AM_PM));
System.out.println(today.get(Calendar.HOUR));
System.out.println(today.get(Calendar.MINUTE));
System.out.println(today.get(Calendar.SECOND));
System.out.println(today.get(Calendar.MILLISECOND));
...

위 필드 이외에도 여러 필드들이 있다.


add(int field, int amount); 를 사용하면 지정한 필드의 값을 원하는 만큼 증가 또는 감소시킬 수 있기 때문에 add메서드를 이용하면 특정 날짜 또는 시간을 기점으로 해서 일정기간 전후의 날짜와 시간을 알아낼 수 있다.

roll(int field, int amount); 도 지정한 필드의 값을 증가 또는 감소시킬 수 있는데 add 메서드와의 차이점은 다른 필드에 영향을 미치지 않는다는 것이다.
예를 들어, add 메서드로 날짜필드(Calendar.DATE)의 값을 31만큼 증가시켰다면 다음 달로 넘어가므로 월 필드(Calendar.MONTH)의 값도 1 증가하지만, roll 메서드는 같은 경우에 월 필드의 값은 변하지 않고 일 필드의 값만 바뀐다.

Calendar date = Calendar.getInstance();
date.set(2022, 2, 31); // 2022년 3월 31일

date.add(Calendar.DATE, 1); // 1일 후
System.out.println(toString(date)); // 2022년 4월 1일

date.add(Calendar.DATE, 1); // 6달 전
System.out.println(toString(date)); // 2021년 10월 1일

date.roll(Calendar.DATE, 1); // 31일 후
System.out.println(toString(date)); // 2021년 10월 1일

date.add(Calendar.DATE, 1); // 31일 후
System.out.println(toString(date)); // 2021년 11월 1일

단, 한 가지 예외가 있는데 일 필드(Calendar.DATE)가 말일(end of month) 일 때, roll 메서드를 이용해서 월 필드(Calendar.MONTH)를 변경하면 일 필드(Calendar.DATE)에 영향을 미칠 수 있다.

Calendar date = Calendar.getInstance();

date.set(2022, 0, 31); // 2022년 1월 31일
System.out.println(toString(date)); // 2022년 1월 31일
date.roll(Calendar.MONTH, 1);
System.out.println(toString(date)); // 2022년 2월 28일

2022년 1월 31일에 대해 roll()을 호출해서 월 필드를 1 증가시켰을 때, 월 필드는 2월이 되는데 2월에는 31일이 없기 때문에 2월의 말일인 28일로 자동 변경되었다. add()도 같은 경우에 마찬가지로 자동 변경된다.

좋은 웹페이지 즐겨찾기