GregorianCalendar — 표준 그레고리력 달력
GregorianCalendar — 표준 그레고리력 달력
GregorianCalendar는 Calendar의 구체적인 서브클래스로, 세계 대부분의 국가에서 사용하는 표준 달력 체계를 제공해요. 율리우스력과 그레고리력 두 체계를 단일 절환점(cutover) 하나로 지원하는 하이브리드 달력이에요. 기본 절환점은 그레고리력이 도입된 날짜(국가에 따라 1582년 10월 15일 또는 그 이후)예요. 절환점은 setGregorianChange()로 바꿀 수 있어요.
본문
public class GregorianCalendar extends Calendar
public static final int BC // 기원전 시대(BCE) 나타내는 ERA 필드 값
public static final int AD // 기원후 시대(CE) 나타내는 ERA 필드 값
그레고리력으로 전환되기 전에는 율리우스력을 구현하는데, 두 달력의 유일한 차이는 윤년 규칙이에요. 율리우스력은 4년마다 윤년이지만, 그레고리력은 400으로 나누어떨어지지 않는 세기(century) 연도를 제외해요. GregorianCalendar는 프로렙틱(proleptic) 율리우스·그레고리력을 구현해서 시간을 무한히 과거/미래로 외삽해 계산해요. 따라서 모든 연도에 대해 일관된 결과를 만들 수 있어요. 다만 역사적으로 정확한 것은 현대 율리우스력 규칙이 채택된 서기 4년 3월 1일부터예요.
그레고리력 도입 전에는 새해 첫날이 3월 25일이었는데, 혼동을 피하기 위해 이 달력은 항상 1월 1일을 사용해요.
생성자
GregorianCalendar()— 기본 타임존과 기본FORMAT로케일로 현재 시간의 기본 달력을 만들어요.GregorianCalendar(TimeZone zone)— 주어진 타임존, 기본 로케일로 만들어요.GregorianCalendar(Locale aLocale)— 기본 타임존, 주어진 로케일로 만들어요.GregorianCalendar(int year, int month, int dayOfMonth)— 주어진 날짜로 만들어요.GregorianCalendar(int year, int month, int dayOfMonth, int hourOfDay, int minute)— 날짜와 시간을 지정해요.GregorianCalendar(int year, int month, int dayOfMonth, int hourOfDay, int minute, int second)— 초까지 지정해요.
setGregorianChange
public void setGregorianChange(Date date)
그레고리력 절환 날짜를 설정해요. 기본은 1582년 10월 15일(그레고리력)이고, 그 이전 날짜는 율리우스력으로 취급돼요. 순수 율리우스력을 얻으려면 Date(Long.MAX_VALUE), 순수 그레고리력을 얻으려면 Date(Long.MIN_VALUE)로 설정해요.
getGregorianChange
public final Date getGregorianChange()
그레고리력 절환 날짜를 반환해요.
isLeapYear
public boolean isLeapYear(int year)
주어진 연도가 윤년인지 판별해요. BC 연도는 1 - year로 지정해요(예: BC 4년은 -3).
getCalendarType
public String getCalendarType()
"gregory"를 달력 타입으로 반환해요.
add / roll
public void add(int field, int amount)
public void roll(int field, boolean up)
public void roll(int field, int amount)
add는 달력 규칙에 따라 지정 필드에 (부호 있는) 시간 양을 더하고 상위 필드로 오버플로를 전파해요. roll은 상위 필드를 바꾸지 않고 지정 필드만 단위를 더하거나 빼요. 예를 들어 1999년 12월 31일에 roll(Calendar.MONTH, true)를 하면 1999년 1월 31일이 되고 YEAR는 그대로 유지돼요.
주·주연도 관련 메서드
getWeekYear(), setWeekDate(int weekYear, int weekOfYear, int dayOfWeek), getWeeksInWeekYear(), isWeekDateSupported() 등으로 주(week) 기반 날짜를 다룰 수 있어요. WEEK_OF_YEAR 값은 1~53 범위로 계산돼요.
필드 범위 메서드
getMinimum, getMaximum, getGreatestMinimum, getLeastMaximum, getActualMinimum, getActualMaximum으로 달력 필드가 가질 수 있는 최소·최대 값을 얻어요. 예를 들어 2004년 2월 1일(윤년)의 DAY_OF_MONTH 실제 최대값은 29예요.
equals / hashCode
public boolean equals(Object obj)
public int hashCode()
동일한 시간 값(에포크로부터의 밀리초 오프셋), 동일한 달력 파라미터, 동일한 그레고리 절환 날짜를 가진 GregorianCalendar끼리 true를 반환해요.
시간대 변환
toZonedDateTime()는 이 객체와 같은 시점을 나타내는 ZonedDateTime으로 변환해요. from(ZonedDateTime zdt)는 ZonedDateTime에서 기본 로케일의 GregorianCalendar를 얻어요. ZonedDateTime이 표현할 수 있는 범위를 넘는 시점이면 IllegalArgumentException을 던져요.