Chronology
Chronology (달력 시스템)
날짜를 구성하고 식별하는 데 쓰는 달력 시스템(calendar system)을 나타내는 인터페이스예요. 주요 날짜·시간 API는 ISO 달력 시스템을 기반으로 하는데, chronology는 그 뒤에서 '달력 시스템'이라는 일반적인 개념을 표현해요. 예를 들어 일본력, 민국력(中華民國), 태국 불교력 등이 있어요.
본문
대부분의 달력 시스템은 태양 주위의 지구 공전과 달 주위의 지구 공전과 연결된 연(year)·월(month)·일(day)이라는 공유 개념을 토대로 동작해요. 이 공유 개념은 ChronoField로 정의되며, 어떤 Chronology 구현에서든 쓸 수 있어요.
LocalDate isoDate = ...;
ThaiBuddhistDate thaiDate = ...;
int isoYear = isoDate.get(ChronoField.YEAR);
int thaiYear = thaiDate.get(ChronoField.YEAR);
위 예처럼 서로 다른 달력 시스템의 날짜 객체라도 같은 ChronoField 상수로 질의할 수 있어요. 이 의미의 자세한 논의는 ChronoLocalDate를 보면 돼요. 일반적인 조언은 ChronoLocalDate보다 알려진 ISO 기반 LocalDate를 쓰라는 것이에요.
Chronology 객체가 보통 ChronoField를 쓰고 era, year-of-era, month-of-year, day-of-month 모델을 기반으로 하지만, 이는 필수가 아니에요. 마야력처럼 완전히 다른 종류의 달력 시스템을 나타내는 인스턴스도 있을 수 있어요.
실용적으로 Chronology 인스턴스는 팩토리 역할도 해요.
of(String)— 식별자로 인스턴스를 찾음ofLocale(Locale)— 로케일로 찾음date(...)계열 —ChronoLocalDate인스턴스 생성 (dateNow(),date(era, yearOfEra, month, day),dateYearDay(...),date(TemporalAccessor)등)
새 달력 추가하기
사용 가능한 chronology 집합은 애플리케이션이 확장할 수 있어요. 새 달력 시스템을 추가하려면 Chronology, ChronoLocalDate, Era의 구현을 작성해야 해요. 달력 특유 로직의 대부분은 ChronoLocalDate 구현에 들어가요. Chronology 구현은 팩토리 역할을 해요.
추가 chronology를 발견할 수 있게 하려면 ServiceLoader를 사용해요. META-INF/services 디렉터리에 java.time.chrono.Chronology라는 이름의 파일을 추가하고 구현 클래스를 나열해야 해요. id나 calendarType으로 찾을 때는 시스템 제공 달력이 먼저 발견되고 그다음 애플리케이션 제공 달력이 발견돼요. 각 chronology는 시스템 내에서 고유한 chronology ID를 정의해야 해요. CLDR 명세가 정의하는 달력 시스템을 나타내면 calendar type은 CLDR type과 (해당된다면) CLDR variant의 결합이에요.