1 /* 2 ***************************************************************************** 3 * Copyright (C) 2003-2008, International Business Machines Corporation 4 * and others. All Rights Reserved. 5 ***************************************************************************** 6 * 7 * File INDIANCAL.H 8 ***************************************************************************** 9 */ 10 11 #ifndef INDIANCAL_H 12 #define INDIANCAL_H 13 14 #include "unicode/utypes.h" 15 16 #if !UCONFIG_NO_FORMATTING 17 18 #include "unicode/calendar.h" 19 20 U_NAMESPACE_BEGIN 21 22 /** 23 * Concrete class which provides the Indian calendar. 24 * <P> 25 * <code>IndianCalendar</code> is a subclass of <code>Calendar</code> 26 * that numbers years since the begining of SAKA ERA. This is the civil calendar 27 * which is accepted by government of India as Indian National Calendar. 28 * The two calendars most widely used in India today are the Vikrama calendar 29 * followed in North India and the Shalivahana or Saka calendar which is followed 30 * in South India and Maharashtra. 31 32 * A variant of the Shalivahana Calendar was reformed and standardized as the 33 * Indian National calendar in 1957. 34 * <p> 35 * Some details of Indian National Calendar (to be implemented) : 36 * The Months 37 * Month Length Start date (Gregorian) 38 * ================================================= 39 * 1 Chaitra 30/31 March 22* 40 * 2 Vaisakha 31 April 21 41 * 3 Jyaistha 31 May 22 42 * 4 Asadha 31 June 22 43 * 5 Sravana 31 July 23 44 * 6 Bhadra 31 August 23 45 * 7 Asvina 30 September 23 46 * 8 Kartika 30 October 23 47 * 9 Agrahayana 30 November 22 48 * 10 Pausa 30 December 22 49 * 11 Magha 30 January 21 50 * 12 Phalguna 30 February 20 51 52 * In leap years, Chaitra has 31 days and starts on March 21 instead. 53 * The leap years of Gregorian calendar and Indian National Calendar are in synchornization. 54 * So When its a leap year in Gregorian calendar then Chaitra has 31 days. 55 * 56 * The Years 57 * Years are counted in the Saka Era, which starts its year 0 in 78AD (by gregorian calendar). 58 * So for eg. 9th June 2006 by Gregorian Calendar, is same as 19th of Jyaistha in 1928 of Saka 59 * era by Indian National Calendar. 60 * <p> 61 * The Indian Calendar has only one allowable era: <code>Saka Era</code>. If the 62 * calendar is not in lenient mode (see <code>setLenient</code>), dates before 63 * 1/1/1 Saka Era are rejected with an <code>IllegalArgumentException</code>. 64 * <p> 65 * @internal 66 */ 67 68 69 class IndianCalendar : public Calendar { 70 public: 71 /** 72 * Useful constants for IndianCalendar. 73 * @internal 74 */ 75 enum EEras { 76 /** 77 * Constant for Chaitra, the 1st month of the Indian year. 78 */ 79 CHAITRA, 80 81 /** 82 * Constant for Vaisakha, the 2nd month of the Indian year. 83 */ 84 VAISAKHA, 85 86 /** 87 * Constant for Jyaistha, the 3rd month of the Indian year. 88 */ 89 JYAISTHA, 90 91 /** 92 * Constant for Asadha, the 4th month of the Indian year. 93 */ 94 ASADHA, 95 96 /** 97 * Constant for Sravana, the 5th month of the Indian year. 98 */ 99 SRAVANA, 100 101 /** 102 * Constant for Bhadra the 6th month of the Indian year 103 */ 104 BHADRA, 105 106 /** 107 * Constant for the Asvina, the 7th month of the Indian year. 108 */ 109 ASVINA, 110 111 /** 112 * Constant for Kartika, the 8th month of the Indian year. 113 */ 114 KARTIKA, 115 116 /** 117 * Constant for Agrahayana, the 9th month of the Indian year. 118 */ 119 AGRAHAYANA, 120 121 /** 122 * Constant for Pausa, the 10th month of the Indian year. 123 */ 124 PAUSA, 125 126 /** 127 * Constant for Magha, the 11th month of the Indian year. 128 */ 129 MAGHA, 130 131 /** 132 * Constant for Phalguna, the 12th month of the Indian year. 133 */ 134 PHALGUNA 135 }; 136 137 //------------------------------------------------------------------------- 138 // Constructors... 139 //------------------------------------------------------------------------- 140 141 /** 142 * Constructs an IndianCalendar based on the current time in the default time zone 143 * with the given locale. 144 * 145 * @param aLocale The given locale. 146 * @param success Indicates the status of IndianCalendar object construction. 147 * Returns U_ZERO_ERROR if constructed successfully. 148 * @param beCivil Whether the calendar should be civil (default-TRUE) or religious (FALSE) 149 * @internal 150 */ 151 IndianCalendar(const Locale& aLocale, UErrorCode &success); 152 153 /** 154 * Copy Constructor 155 * @internal 156 */ 157 IndianCalendar(const IndianCalendar& other); 158 159 /** 160 * Destructor. 161 * @internal 162 */ 163 virtual ~IndianCalendar(); 164 165 /** 166 * Determines whether this object uses the fixed-cycle Indian civil calendar 167 * or an approximation of the religious, astronomical calendar. 168 * 169 * @param beCivil <code>CIVIL</code> to use the civil calendar, 170 * <code>ASTRONOMICAL</code> to use the astronomical calendar. 171 * @internal 172 */ 173 //void setCivil(ECivil beCivil, UErrorCode &status); 174 175 /** 176 * Returns <code>true</code> if this object is using the fixed-cycle civil 177 * calendar, or <code>false</code> if using the religious, astronomical 178 * calendar. 179 * @internal 180 */ 181 //UBool isCivil(); 182 183 184 // TODO: copy c'tor, etc 185 186 // clone 187 virtual Calendar* clone() const; 188 189 private: 190 /** 191 * Determine whether a year is the gregorian year a leap year 192 */ 193 //static UBool isGregorianLeap(int32_t year); 194 //---------------------------------------------------------------------- 195 // Calendar framework 196 //---------------------------------------------------------------------- 197 protected: 198 /** 199 * @internal 200 */ 201 virtual int32_t handleGetLimit(UCalendarDateFields field, ELimitType limitType) const; 202 203 /** 204 * Return the length (in days) of the given month. 205 * 206 * @param year The year in Saka era 207 * @param year The month(0-based) in Indian year 208 * @internal 209 */ 210 virtual int32_t handleGetMonthLength(int32_t extendedYear, int32_t month) const; 211 212 /** 213 * Return the number of days in the given Indian year 214 * @internal 215 */ 216 virtual int32_t handleGetYearLength(int32_t extendedYear) const; 217 218 //------------------------------------------------------------------------- 219 // Functions for converting from field values to milliseconds.... 220 //------------------------------------------------------------------------- 221 222 // Return JD of start of given month/year 223 /** 224 * @internal 225 */ 226 virtual int32_t handleComputeMonthStart(int32_t eyear, int32_t month, UBool useMonth) const; 227 228 //------------------------------------------------------------------------- 229 // Functions for converting from milliseconds to field values 230 //------------------------------------------------------------------------- 231 232 /** 233 * @internal 234 */ 235 virtual int32_t handleGetExtendedYear(); 236 237 /** 238 * Override Calendar to compute several fields specific to the Indian 239 * calendar system. These are: 240 * 241 * <ul><li>ERA 242 * <li>YEAR 243 * <li>MONTH 244 * <li>DAY_OF_MONTH 245 * <li>DAY_OF_YEAR 246 * <li>EXTENDED_YEAR</ul> 247 * 248 * The DAY_OF_WEEK and DOW_LOCAL fields are already set when this 249 * method is called. The getGregorianXxx() methods return Gregorian 250 * calendar equivalents for the given Julian day. 251 * @internal 252 */ 253 virtual void handleComputeFields(int32_t julianDay, UErrorCode &status); 254 255 // UObject stuff 256 public: 257 /** 258 * @return The class ID for this object. All objects of a given class have the 259 * same class ID. Objects of other classes have different class IDs. 260 * @internal 261 */ 262 virtual UClassID getDynamicClassID(void) const; 263 264 /** 265 * Return the class ID for this class. This is useful only for comparing to a return 266 * value from getDynamicClassID(). For example: 267 * 268 * Base* polymorphic_pointer = createPolymorphicObject(); 269 * if (polymorphic_pointer->getDynamicClassID() == 270 * Derived::getStaticClassID()) ... 271 * 272 * @return The class ID for all objects of this class. 273 * @internal 274 */ 275 U_I18N_API static UClassID U_EXPORT2 getStaticClassID(void); 276 277 /** 278 * return the calendar type, "buddhist". 279 * 280 * @return calendar type 281 * @internal 282 */ 283 virtual const char * getType() const; 284 285 private: 286 IndianCalendar(); // default constructor not implemented 287 288 // Default century. 289 protected: 290 291 /** 292 * (Overrides Calendar) Return true if the current date for this Calendar is in 293 * Daylight Savings Time. Recognizes DST_OFFSET, if it is set. 294 * 295 * @param status Fill-in parameter which receives the status of this operation. 296 * @return True if the current date for this Calendar is in Daylight Savings Time, 297 * false, otherwise. 298 * @internal 299 */ 300 virtual UBool inDaylightTime(UErrorCode& status) const; 301 302 303 /** 304 * Returns TRUE because the Indian Calendar does have a default century 305 * @internal 306 */ 307 virtual UBool haveDefaultCentury() const; 308 309 /** 310 * Returns the date of the start of the default century 311 * @return start of century - in milliseconds since epoch, 1970 312 * @internal 313 */ 314 virtual UDate defaultCenturyStart() const; 315 316 /** 317 * Returns the year in which the default century begins 318 * @internal 319 */ 320 virtual int32_t defaultCenturyStartYear() const; 321 322 private: // default century stuff. 323 /** 324 * The system maintains a static default century start date. This is initialized 325 * the first time it is used. Before then, it is set to SYSTEM_DEFAULT_CENTURY to 326 * indicate an uninitialized state. Once the system default century date and year 327 * are set, they do not change. 328 */ 329 static UDate fgSystemDefaultCenturyStart; 330 331 /** 332 * See documentation for systemDefaultCenturyStart. 333 */ 334 static int32_t fgSystemDefaultCenturyStartYear; 335 336 /** 337 * Default value that indicates the defaultCenturyStartYear is unitialized 338 */ 339 static const int32_t fgSystemDefaultCenturyYear; 340 341 /** 342 * start of default century, as a date 343 */ 344 static const UDate fgSystemDefaultCentury; 345 346 /** 347 * Returns the beginning date of the 100-year window that dates 348 * with 2-digit years are considered to fall within. 349 */ 350 UDate internalGetDefaultCenturyStart(void) const; 351 352 /** 353 * Returns the first year of the 100-year window that dates with 354 * 2-digit years are considered to fall within. 355 */ 356 int32_t internalGetDefaultCenturyStartYear(void) const; 357 358 /** 359 * Initializes the 100-year window that dates with 2-digit years 360 * are considered to fall within so that its start date is 80 years 361 * before the current time. 362 */ 363 static void initializeSystemDefaultCentury(void); 364 }; 365 366 U_NAMESPACE_END 367 368 #endif 369 #endif 370 371 372 373