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