1f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)/* 2f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)******************************************************************************* 3f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)* Copyright (C) 2003 - 2009, International Business Machines Corporation and * 4f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)* others. All Rights Reserved. * 5f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)******************************************************************************* 6f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*/ 7f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 8f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#include "unicode/utypes.h" 9f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 10f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#if !UCONFIG_NO_FORMATTING 11f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 12f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#include "cecal.h" 13f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#include "gregoimp.h" //Math 14f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 15f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)U_NAMESPACE_BEGIN 16f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 17f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)static const int32_t LIMITS[UCAL_FIELD_COUNT][4] = { 18f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // Minimum Greatest Least Maximum 19f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // Minimum Maximum 20f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) { 0, 0, 1, 1}, // ERA 21f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) { 1, 1, 5000000, 5000000}, // YEAR 22f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) { 0, 0, 12, 12}, // MONTH 23f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) { 1, 1, 52, 53}, // WEEK_OF_YEAR 24f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) {/*N/A*/-1,/*N/A*/-1,/*N/A*/-1,/*N/A*/-1}, // WEEK_OF_MONTH 25f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) { 1, 1, 5, 30}, // DAY_OF_MONTH 26f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) { 1, 1, 365, 366}, // DAY_OF_YEAR 27f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) {/*N/A*/-1,/*N/A*/-1,/*N/A*/-1,/*N/A*/-1}, // DAY_OF_WEEK 28f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) { -1, -1, 1, 5}, // DAY_OF_WEEK_IN_MONTH 29f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) {/*N/A*/-1,/*N/A*/-1,/*N/A*/-1,/*N/A*/-1}, // AM_PM 30f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) {/*N/A*/-1,/*N/A*/-1,/*N/A*/-1,/*N/A*/-1}, // HOUR 31f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) {/*N/A*/-1,/*N/A*/-1,/*N/A*/-1,/*N/A*/-1}, // HOUR_OF_DAY 32f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) {/*N/A*/-1,/*N/A*/-1,/*N/A*/-1,/*N/A*/-1}, // MINUTE 33f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) {/*N/A*/-1,/*N/A*/-1,/*N/A*/-1,/*N/A*/-1}, // SECOND 34f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) {/*N/A*/-1,/*N/A*/-1,/*N/A*/-1,/*N/A*/-1}, // MILLISECOND 35f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) {/*N/A*/-1,/*N/A*/-1,/*N/A*/-1,/*N/A*/-1}, // ZONE_OFFSET 36f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) {/*N/A*/-1,/*N/A*/-1,/*N/A*/-1,/*N/A*/-1}, // DST_OFFSET 37f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) { -5000000, -5000000, 5000000, 5000000}, // YEAR_WOY 38f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) {/*N/A*/-1,/*N/A*/-1,/*N/A*/-1,/*N/A*/-1}, // DOW_LOCAL 39f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) { -5000000, -5000000, 5000000, 5000000}, // EXTENDED_YEAR 40f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) {/*N/A*/-1,/*N/A*/-1,/*N/A*/-1,/*N/A*/-1}, // JULIAN_DAY 41f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) {/*N/A*/-1,/*N/A*/-1,/*N/A*/-1,/*N/A*/-1}, // MILLISECONDS_IN_DAY 42f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) {/*N/A*/-1,/*N/A*/-1,/*N/A*/-1,/*N/A*/-1}, // IS_LEAP_MONTH 43f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)}; 44f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 45f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)//------------------------------------------------------------------------- 46f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)// Constructors... 47f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)//------------------------------------------------------------------------- 48f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 49f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)CECalendar::CECalendar(const Locale& aLocale, UErrorCode& success) 50f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles): Calendar(TimeZone::createDefault(), aLocale, success) 51f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles){ 52f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) setTimeInMillis(getNow(), success); 53f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)} 54f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 55f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)CECalendar::CECalendar (const CECalendar& other) 56f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles): Calendar(other) 57f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles){ 58f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)} 59f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 60f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)CECalendar::~CECalendar() 61f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles){ 62f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)} 63f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 64f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)CECalendar& 65f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)CECalendar::operator=(const CECalendar& right) 66f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles){ 67f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) Calendar::operator=(right); 68f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) return *this; 69f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)} 70f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 71f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)//------------------------------------------------------------------------- 72f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)// Calendar framework 73f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)//------------------------------------------------------------------------- 74f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 75f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)int32_t 76f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)CECalendar::handleComputeMonthStart(int32_t eyear,int32_t emonth, UBool /*useMonth*/) const 77f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles){ 78f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) return ceToJD(eyear, emonth, 0, getJDEpochOffset()); 79f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)} 80f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 81f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)int32_t 82f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)CECalendar::handleGetLimit(UCalendarDateFields field, ELimitType limitType) const 83f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles){ 84f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) return LIMITS[field][limitType]; 85f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)} 86f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 87f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)UBool 88f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)CECalendar::inDaylightTime(UErrorCode& status) const 89f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles){ 90f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if (U_FAILURE(status) || !getTimeZone().useDaylightTime()) { 91f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) return FALSE; 92f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 93f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 94f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // Force an update of the state of the Calendar. 95f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) ((CECalendar*)this)->complete(status); // cast away const 96f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 97f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) return (UBool)(U_SUCCESS(status) ? (internalGet(UCAL_DST_OFFSET) != 0) : FALSE); 98f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)} 99f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 100f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)UBool 101f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)CECalendar::haveDefaultCentury() const 102f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles){ 103f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) return TRUE; 104f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)} 105f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 106f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)//------------------------------------------------------------------------- 107f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)// Calendar system Conversion methods... 108f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)//------------------------------------------------------------------------- 109f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)int32_t 110f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)CECalendar::ceToJD(int32_t year, int32_t month, int32_t date, int32_t jdEpochOffset) 111f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles){ 112f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // handle month > 12, < 0 (e.g. from add/set) 113f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if ( month >= 0 ) { 114f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) year += month/13; 115f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) month %= 13; 116f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } else { 117f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) ++month; 118f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) year += month/13 - 1; 119f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) month = month%13 + 12; 120f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 121f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) return (int32_t) ( 122f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) jdEpochOffset // difference from Julian epoch to 1,1,1 123f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) + 365 * year // number of days from years 124f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) + ClockMath::floorDivide(year, 4) // extra day of leap year 125f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) + 30 * month // number of days from months (months are 0-based) 126f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) + date - 1 // number of days for present month (1 based) 127f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) ); 128f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)} 129f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 130f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)void 131f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)CECalendar::jdToCE(int32_t julianDay, int32_t jdEpochOffset, int32_t& year, int32_t& month, int32_t& day) 132f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles){ 133f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) int32_t c4; // number of 4 year cycle (1461 days) 134f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) int32_t r4; // remainder of 4 year cycle, always positive 135f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 136f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) c4 = ClockMath::floorDivide(julianDay - jdEpochOffset, 1461, r4); 137f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 138f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) year = 4 * c4 + (r4/365 - r4/1460); // 4 * <number of 4year cycle> + <years within the last cycle> 139f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 140f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) int32_t doy = (r4 == 1460) ? 365 : (r4 % 365); // days in present year 141f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 142f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) month = doy / 30; // 30 -> Coptic/Ethiopic month length up to 12th month 143f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) day = (doy % 30) + 1; // 1-based days in a month 144f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)} 145f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 146f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)U_NAMESPACE_END 147f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 148f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#endif /* #if !UCONFIG_NO_FORMATTING */ 149f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)//eof 150