185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho/* 285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho******************************************************************************* 385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho* Copyright (C) 2003 - 2009, International Business Machines Corporation and * 485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho* others. All Rights Reserved. * 585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho******************************************************************************* 685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho*/ 785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#include "unicode/utypes.h" 985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 1085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#if !UCONFIG_NO_FORMATTING 1185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 1285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#include "cecal.h" 1385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#include "gregoimp.h" //Math 1485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 1585bf2e2fbc60a9f938064abc8127d61da7d19882Claire HoU_NAMESPACE_BEGIN 1685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 1785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hostatic const int32_t LIMITS[UCAL_FIELD_COUNT][4] = { 1885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho // Minimum Greatest Least Maximum 1985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho // Minimum Maximum 2085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho { 0, 0, 1, 1}, // ERA 2185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho { 1, 1, 5000000, 5000000}, // YEAR 2285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho { 0, 0, 12, 12}, // MONTH 2385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho { 1, 1, 52, 53}, // WEEK_OF_YEAR 2485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho {/*N/A*/-1,/*N/A*/-1,/*N/A*/-1,/*N/A*/-1}, // WEEK_OF_MONTH 2585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho { 1, 1, 5, 30}, // DAY_OF_MONTH 2685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho { 1, 1, 365, 366}, // DAY_OF_YEAR 2785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho {/*N/A*/-1,/*N/A*/-1,/*N/A*/-1,/*N/A*/-1}, // DAY_OF_WEEK 2885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho { -1, -1, 1, 5}, // DAY_OF_WEEK_IN_MONTH 2985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho {/*N/A*/-1,/*N/A*/-1,/*N/A*/-1,/*N/A*/-1}, // AM_PM 3085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho {/*N/A*/-1,/*N/A*/-1,/*N/A*/-1,/*N/A*/-1}, // HOUR 3185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho {/*N/A*/-1,/*N/A*/-1,/*N/A*/-1,/*N/A*/-1}, // HOUR_OF_DAY 3285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho {/*N/A*/-1,/*N/A*/-1,/*N/A*/-1,/*N/A*/-1}, // MINUTE 3385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho {/*N/A*/-1,/*N/A*/-1,/*N/A*/-1,/*N/A*/-1}, // SECOND 3485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho {/*N/A*/-1,/*N/A*/-1,/*N/A*/-1,/*N/A*/-1}, // MILLISECOND 3585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho {/*N/A*/-1,/*N/A*/-1,/*N/A*/-1,/*N/A*/-1}, // ZONE_OFFSET 3685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho {/*N/A*/-1,/*N/A*/-1,/*N/A*/-1,/*N/A*/-1}, // DST_OFFSET 3785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho { -5000000, -5000000, 5000000, 5000000}, // YEAR_WOY 3885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho {/*N/A*/-1,/*N/A*/-1,/*N/A*/-1,/*N/A*/-1}, // DOW_LOCAL 3985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho { -5000000, -5000000, 5000000, 5000000}, // EXTENDED_YEAR 4085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho {/*N/A*/-1,/*N/A*/-1,/*N/A*/-1,/*N/A*/-1}, // JULIAN_DAY 4185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho {/*N/A*/-1,/*N/A*/-1,/*N/A*/-1,/*N/A*/-1}, // MILLISECONDS_IN_DAY 4285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho {/*N/A*/-1,/*N/A*/-1,/*N/A*/-1,/*N/A*/-1}, // IS_LEAP_MONTH 4385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho}; 4485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 4585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho//------------------------------------------------------------------------- 4685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho// Constructors... 4785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho//------------------------------------------------------------------------- 4885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 4985bf2e2fbc60a9f938064abc8127d61da7d19882Claire HoCECalendar::CECalendar(const Locale& aLocale, UErrorCode& success) 5085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho: Calendar(TimeZone::createDefault(), aLocale, success) 5185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho{ 5285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho setTimeInMillis(getNow(), success); 5385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho} 5485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 5585bf2e2fbc60a9f938064abc8127d61da7d19882Claire HoCECalendar::CECalendar (const CECalendar& other) 5685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho: Calendar(other) 5785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho{ 5885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho} 5985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 6085bf2e2fbc60a9f938064abc8127d61da7d19882Claire HoCECalendar::~CECalendar() 6185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho{ 6285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho} 6385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 6485bf2e2fbc60a9f938064abc8127d61da7d19882Claire HoCECalendar& 6585bf2e2fbc60a9f938064abc8127d61da7d19882Claire HoCECalendar::operator=(const CECalendar& right) 6685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho{ 6785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho Calendar::operator=(right); 6885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho return *this; 6985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho} 7085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 7185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho//------------------------------------------------------------------------- 7285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho// Calendar framework 7385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho//------------------------------------------------------------------------- 7485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 7585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hoint32_t 7685bf2e2fbc60a9f938064abc8127d61da7d19882Claire HoCECalendar::handleComputeMonthStart(int32_t eyear,int32_t emonth, UBool /*useMonth*/) const 7785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho{ 7885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho return ceToJD(eyear, emonth, 0, getJDEpochOffset()); 7985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho} 8085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 8185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hoint32_t 8285bf2e2fbc60a9f938064abc8127d61da7d19882Claire HoCECalendar::handleGetLimit(UCalendarDateFields field, ELimitType limitType) const 8385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho{ 8485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho return LIMITS[field][limitType]; 8585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho} 8685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 8785bf2e2fbc60a9f938064abc8127d61da7d19882Claire HoUBool 8885bf2e2fbc60a9f938064abc8127d61da7d19882Claire HoCECalendar::inDaylightTime(UErrorCode& status) const 8985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho{ 9085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (U_FAILURE(status) || !getTimeZone().useDaylightTime()) { 9185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho return FALSE; 9285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 9385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 9485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho // Force an update of the state of the Calendar. 9585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho ((CECalendar*)this)->complete(status); // cast away const 9685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 9785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho return (UBool)(U_SUCCESS(status) ? (internalGet(UCAL_DST_OFFSET) != 0) : FALSE); 9885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho} 9985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 10085bf2e2fbc60a9f938064abc8127d61da7d19882Claire HoUBool 10185bf2e2fbc60a9f938064abc8127d61da7d19882Claire HoCECalendar::haveDefaultCentury() const 10285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho{ 10385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho return TRUE; 10485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho} 10585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 10685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho//------------------------------------------------------------------------- 10785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho// Calendar system Conversion methods... 10885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho//------------------------------------------------------------------------- 10985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hoint32_t 11085bf2e2fbc60a9f938064abc8127d61da7d19882Claire HoCECalendar::ceToJD(int32_t year, int32_t month, int32_t date, int32_t jdEpochOffset) 11185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho{ 11285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho // handle month > 12, < 0 (e.g. from add/set) 11385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if ( month >= 0 ) { 11485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho year += month/13; 11585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho month %= 13; 11685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } else { 11785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho ++month; 11885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho year += month/13 - 1; 11985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho month = month%13 + 12; 12085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 12185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho return (int32_t) ( 12285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho jdEpochOffset // difference from Julian epoch to 1,1,1 12385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho + 365 * year // number of days from years 12485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho + ClockMath::floorDivide(year, 4) // extra day of leap year 12585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho + 30 * month // number of days from months (months are 0-based) 12685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho + date - 1 // number of days for present month (1 based) 12785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho ); 12885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho} 12985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 13085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hovoid 13185bf2e2fbc60a9f938064abc8127d61da7d19882Claire HoCECalendar::jdToCE(int32_t julianDay, int32_t jdEpochOffset, int32_t& year, int32_t& month, int32_t& day) 13285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho{ 13385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho int32_t c4; // number of 4 year cycle (1461 days) 13485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho int32_t r4; // remainder of 4 year cycle, always positive 13585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 13685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho c4 = ClockMath::floorDivide(julianDay - jdEpochOffset, 1461, r4); 13785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 13885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho year = 4 * c4 + (r4/365 - r4/1460); // 4 * <number of 4year cycle> + <years within the last cycle> 13985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 14085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho int32_t doy = (r4 == 1460) ? 365 : (r4 % 365); // days in present year 14185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 14285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho month = doy / 30; // 30 -> Coptic/Ethiopic month length up to 12th month 14385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho day = (doy % 30) + 1; // 1-based days in a month 14485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho} 14585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 14685bf2e2fbc60a9f938064abc8127d61da7d19882Claire HoU_NAMESPACE_END 14785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 14885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#endif /* #if !UCONFIG_NO_FORMATTING */ 14985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho//eof 150