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
20U_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
69class IndianCalendar : public Calendar {
70public:
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
285private:
286  IndianCalendar(); // default constructor not implemented
287
288  // Default century.
289protected:
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
366U_NAMESPACE_END
367
368#endif
369#endif
370
371
372
373