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()도 같은 경우에 마찬가지로 자동 변경된다.
Author And Source
이 문제에 관하여(Java Calendar, Date, Time), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@rt3310/Java-Calendar-Date저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)