• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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