ok, now for the chinese calendar. like the preceding calendars, its based on ICU4J.
the traditional Chinese calendar is a lunisolar calendar (the same type as the Hebrew calendar). months start with a new moon, with each month numbered according to solar events. why? to guarantee that month # 11 will always contains the winter solstice. how? leap months are inserted in certain years (i feel another non-gregorian calendar induced headache coming on). these leap months are numbered the same as the month they follow. which month is a leap month? depends entirely on the movements of the sun and moon (i.e. i can't follow the math very far) . the normal ERA field differs from other calendars as it holds the 60 year "cycle" number, right now we're in the 78th cycle which began in 1983 AD. years are counted sequentially, numbering from the 61st year of the reign of Huang Di, 2637 BC, which is designated year 1 on the Chinese calendar (yes, that's right, this calendaring system is over 4,000 years old). let's look at an example:
where 20 is the year in the current cycle, 78 is the cycle for this calendar (ERA in other calendars), 9 is the month and 13 is the day.
since ICU4J's ChineseCalendar defines an additional field (for leap month) and redefines the way the ERA field (no longer AD,BC, etc.) is used, this CFC has to use a different date format class, ChineseDateFormat.
this CFC adds 4 generic functions (i forgot that some calendars need special date logic):
- isBefore to compare two dates to tell if one is before the other
- isAfter which compares two dates to tell if one is after the other
- getJulianDay returns the true Julian day for a given date
- getExtendedYear returns the extended year, i.e. years since calendar start (in this case, current year + 2637)
i'll retrofit these to the other non-gregorgian calendars. the date logic is probably more useful to the calendars that use calendar math different from the gregorian calendar (chinese, hebrew, islamic).
and 7 functions that are specific to this calendar (though i guess some can be applied to other calendars):
- isLeapMonth determines if a given date is in a leap month
- getCycle returns cycle for given date
- getCycleYear returns year in cycle for given date
- getMonth returns month in cycle year for given date
- getDay returns day in month for give date
- getDayOfYear returns day of cycle year for given date
- getWeek returns week of cycle year for given date
the CFC's testbed is here. posted to the devnet gallery where i guess it will become available sooner or later.
next the astronomical calendar. this is one is quite tricky, its also somewhat in a state of flux (the ICU4J team's working on this code) but since it forms the basis of some of the existing calendars might as well give it a shot.