/* * Override Calendar to compute several fields specific to the Indian * calendar system. These are: * * <ul><li>ERA * <li>YEAR * <li>MONTH * <li>DAY_OF_MONTH * <li>EXTENDED_YEAR</ul> * * The DAY_OF_WEEK and DOW_LOCAL fields are already set when this * method is called. The getGregorianXxx() methods return Gregorian * calendar equivalents for the given Julian day. */ void IndianCalendar::handleComputeFields(int32_t julianDay, UErrorCode& /* status */) { double jdAtStartOfGregYear; int32_t leapMonth, IndianYear, yday, IndianMonth, IndianDayOfMonth, mday; int32_t gregorianYear; // Stores gregorian date corresponding to Julian day; int32_t gd[3]; gregorianYear = jdToGregorian(julianDay, gd)[0]; // Gregorian date for Julian day IndianYear = gregorianYear - INDIAN_ERA_START; // Year in Saka era jdAtStartOfGregYear = gregorianToJD(gregorianYear, 1, 1); // JD at start of Gregorian year yday = (int32_t)(julianDay - jdAtStartOfGregYear); // Day number in Gregorian year (starting from 0) if (yday < INDIAN_YEAR_START) { // Day is at the end of the preceding Saka year IndianYear -= 1; leapMonth = isGregorianLeap(gregorianYear - 1) ? 31 : 30; // Days in leapMonth this year, previous Gregorian year yday += leapMonth + (31 * 5) + (30 * 3) + 10; } else { leapMonth = isGregorianLeap(gregorianYear) ? 31 : 30; // Days in leapMonth this year yday -= INDIAN_YEAR_START; } if (yday < leapMonth) { IndianMonth = 0; IndianDayOfMonth = yday + 1; } else { mday = yday - leapMonth; if (mday < (31 * 5)) { IndianMonth = (int32_t)uprv_floor(mday / 31) + 1; IndianDayOfMonth = (mday % 31) + 1; } else { mday -= 31 * 5; IndianMonth = (int32_t)uprv_floor(mday / 30) + 6; IndianDayOfMonth = (mday % 30) + 1; } } internalSet(UCAL_ERA, 0); internalSet(UCAL_EXTENDED_YEAR, IndianYear); internalSet(UCAL_YEAR, IndianYear); internalSet(UCAL_MONTH, IndianMonth); internalSet(UCAL_DAY_OF_MONTH, IndianDayOfMonth); internalSet(UCAL_DAY_OF_YEAR, yday + 1); // yday is 0-based }
std::string mjdToGregorian(const Real mjd) { Real jd = mjd + 2430000; std::string newDate = jdToGregorian(jd); return newDate; }