intl/icu/source/i18n/unicode/gregocal.h

Wed, 31 Dec 2014 07:22:50 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Wed, 31 Dec 2014 07:22:50 +0100
branch
TOR_BUG_3246
changeset 4
fc2d59ddac77
permissions
-rw-r--r--

Correct previous dual key logic pending first delivery installment.

     1 /*
     2 * Copyright (C) 1997-2013, International Business Machines Corporation and others.
     3 * All Rights Reserved.
     4 ********************************************************************************
     5 *
     6 * File GREGOCAL.H
     7 *
     8 * Modification History:
     9 *
    10 *   Date        Name        Description
    11 *   04/22/97    aliu        Overhauled header.
    12 *    07/28/98    stephen        Sync with JDK 1.2
    13 *    09/04/98    stephen        Re-sync with JDK 8/31 putback
    14 *    09/14/98    stephen        Changed type of kOneDay, kOneWeek to double.
    15 *                            Fixed bug in roll()
    16 *   10/15/99    aliu        Fixed j31, incorrect WEEK_OF_YEAR computation.
    17 *                           Added documentation of WEEK_OF_YEAR computation.
    18 *   10/15/99    aliu        Fixed j32, cannot set date to Feb 29 2000 AD.
    19 *                           {JDK bug 4210209 4209272}
    20 *   11/07/2003  srl         Update, clean up documentation.
    21 ********************************************************************************
    22 */
    24 #ifndef GREGOCAL_H
    25 #define GREGOCAL_H
    27 #include "unicode/utypes.h"
    29 #if !UCONFIG_NO_FORMATTING
    31 #include "unicode/calendar.h"
    33 /**
    34  * \file 
    35  * \brief C++ API: Concrete class which provides the standard calendar.
    36  */
    38 U_NAMESPACE_BEGIN
    40 /** 
    41  * Concrete class which provides the standard calendar used by most of the world.
    42  * <P>
    43  * The standard (Gregorian) calendar has 2 eras, BC and AD.
    44  * <P>
    45  * This implementation handles a single discontinuity, which corresponds by default to
    46  * the date the Gregorian calendar was originally instituted (October 15, 1582). Not all
    47  * countries adopted the Gregorian calendar then, so this cutover date may be changed by
    48  * the caller.
    49  * <P>
    50  * Prior to the institution of the Gregorian Calendar, New Year's Day was March 25. To
    51  * avoid confusion, this Calendar always uses January 1. A manual adjustment may be made
    52  * if desired for dates that are prior to the Gregorian changeover and which fall
    53  * between January 1 and March 24.
    54  *
    55  * <p>Values calculated for the <code>WEEK_OF_YEAR</code> field range from 1 to
    56  * 53.  Week 1 for a year is the first week that contains at least
    57  * <code>getMinimalDaysInFirstWeek()</code> days from that year.  It thus
    58  * depends on the values of <code>getMinimalDaysInFirstWeek()</code>,
    59  * <code>getFirstDayOfWeek()</code>, and the day of the week of January 1.
    60  * Weeks between week 1 of one year and week 1 of the following year are
    61  * numbered sequentially from 2 to 52 or 53 (as needed).
    62  *
    63  * <p>For example, January 1, 1998 was a Thursday.  If
    64  * <code>getFirstDayOfWeek()</code> is <code>MONDAY</code> and
    65  * <code>getMinimalDaysInFirstWeek()</code> is 4 (these are the values
    66  * reflecting ISO 8601 and many national standards), then week 1 of 1998 starts
    67  * on December 29, 1997, and ends on January 4, 1998.  If, however,
    68  * <code>getFirstDayOfWeek()</code> is <code>SUNDAY</code>, then week 1 of 1998
    69  * starts on January 4, 1998, and ends on January 10, 1998; the first three days
    70  * of 1998 then are part of week 53 of 1997.
    71  *
    72  * <p>Example for using GregorianCalendar:
    73  * <pre>
    74  * \code
    75  *     // get the supported ids for GMT-08:00 (Pacific Standard Time)
    76  *     UErrorCode success = U_ZERO_ERROR;
    77  *     const StringEnumeration *ids = TimeZone::createEnumeration(-8 * 60 * 60 * 1000);
    78  *     // if no ids were returned, something is wrong. get out.
    79  *     if (ids == 0 || ids->count(success) == 0) {
    80  *         return;
    81  *     }
    82  *
    83  *     // begin output
    84  *     cout << "Current Time" << endl;
    85  *
    86  *     // create a Pacific Standard Time time zone
    87  *     SimpleTimeZone* pdt = new SimpleTimeZone(-8 * 60 * 60 * 1000, ids->unext(NULL, success)));
    88  *
    89  *     // set up rules for daylight savings time
    90  *     pdt->setStartRule(UCAL_MARCH, 1, UCAL_SUNDAY, 2 * 60 * 60 * 1000);
    91  *     pdt->setEndRule(UCAL_NOVEMBER, 2, UCAL_SUNDAY, 2 * 60 * 60 * 1000);
    92  *
    93  *     // create a GregorianCalendar with the Pacific Daylight time zone
    94  *     // and the current date and time
    95  *     Calendar* calendar = new GregorianCalendar( pdt, success );
    96  *
    97  *     // print out a bunch of interesting things
    98  *     cout << "ERA: " << calendar->get( UCAL_ERA, success ) << endl;
    99  *     cout << "YEAR: " << calendar->get( UCAL_YEAR, success ) << endl;
   100  *     cout << "MONTH: " << calendar->get( UCAL_MONTH, success ) << endl;
   101  *     cout << "WEEK_OF_YEAR: " << calendar->get( UCAL_WEEK_OF_YEAR, success ) << endl;
   102  *     cout << "WEEK_OF_MONTH: " << calendar->get( UCAL_WEEK_OF_MONTH, success ) << endl;
   103  *     cout << "DATE: " << calendar->get( UCAL_DATE, success ) << endl;
   104  *     cout << "DAY_OF_MONTH: " << calendar->get( UCAL_DAY_OF_MONTH, success ) << endl;
   105  *     cout << "DAY_OF_YEAR: " << calendar->get( UCAL_DAY_OF_YEAR, success ) << endl;
   106  *     cout << "DAY_OF_WEEK: " << calendar->get( UCAL_DAY_OF_WEEK, success ) << endl;
   107  *     cout << "DAY_OF_WEEK_IN_MONTH: " << calendar->get( UCAL_DAY_OF_WEEK_IN_MONTH, success ) << endl;
   108  *     cout << "AM_PM: " << calendar->get( UCAL_AM_PM, success ) << endl;
   109  *     cout << "HOUR: " << calendar->get( UCAL_HOUR, success ) << endl;
   110  *     cout << "HOUR_OF_DAY: " << calendar->get( UCAL_HOUR_OF_DAY, success ) << endl;
   111  *     cout << "MINUTE: " << calendar->get( UCAL_MINUTE, success ) << endl;
   112  *     cout << "SECOND: " << calendar->get( UCAL_SECOND, success ) << endl;
   113  *     cout << "MILLISECOND: " << calendar->get( UCAL_MILLISECOND, success ) << endl;
   114  *     cout << "ZONE_OFFSET: " << (calendar->get( UCAL_ZONE_OFFSET, success )/(60*60*1000)) << endl;
   115  *     cout << "DST_OFFSET: " << (calendar->get( UCAL_DST_OFFSET, success )/(60*60*1000)) << endl;
   116  *
   117  *     cout << "Current Time, with hour reset to 3" << endl;
   118  *     calendar->clear(UCAL_HOUR_OF_DAY); // so doesn't override
   119  *     calendar->set(UCAL_HOUR, 3);
   120  *     cout << "ERA: " << calendar->get( UCAL_ERA, success ) << endl;
   121  *     cout << "YEAR: " << calendar->get( UCAL_YEAR, success ) << endl;
   122  *     cout << "MONTH: " << calendar->get( UCAL_MONTH, success ) << endl;
   123  *     cout << "WEEK_OF_YEAR: " << calendar->get( UCAL_WEEK_OF_YEAR, success ) << endl;
   124  *     cout << "WEEK_OF_MONTH: " << calendar->get( UCAL_WEEK_OF_MONTH, success ) << endl;
   125  *     cout << "DATE: " << calendar->get( UCAL_DATE, success ) << endl;
   126  *     cout << "DAY_OF_MONTH: " << calendar->get( UCAL_DAY_OF_MONTH, success ) << endl;
   127  *     cout << "DAY_OF_YEAR: " << calendar->get( UCAL_DAY_OF_YEAR, success ) << endl;
   128  *     cout << "DAY_OF_WEEK: " << calendar->get( UCAL_DAY_OF_WEEK, success ) << endl;
   129  *     cout << "DAY_OF_WEEK_IN_MONTH: " << calendar->get( UCAL_DAY_OF_WEEK_IN_MONTH, success ) << endl;
   130  *     cout << "AM_PM: " << calendar->get( UCAL_AM_PM, success ) << endl;
   131  *     cout << "HOUR: " << calendar->get( UCAL_HOUR, success ) << endl;
   132  *     cout << "HOUR_OF_DAY: " << calendar->get( UCAL_HOUR_OF_DAY, success ) << endl;
   133  *     cout << "MINUTE: " << calendar->get( UCAL_MINUTE, success ) << endl;
   134  *     cout << "SECOND: " << calendar->get( UCAL_SECOND, success ) << endl;
   135  *     cout << "MILLISECOND: " << calendar->get( UCAL_MILLISECOND, success ) << endl;
   136  *     cout << "ZONE_OFFSET: " << (calendar->get( UCAL_ZONE_OFFSET, success )/(60*60*1000)) << endl; // in hours
   137  *     cout << "DST_OFFSET: " << (calendar->get( UCAL_DST_OFFSET, success )/(60*60*1000)) << endl; // in hours
   138  *
   139  *     if (U_FAILURE(success)) {
   140  *         cout << "An error occured. success=" << u_errorName(success) << endl;
   141  *     }
   142  *
   143  *     delete ids;
   144  *     delete calendar; // also deletes pdt
   145  * \endcode
   146  * </pre>
   147  * @stable ICU 2.0
   148  */
   149 class U_I18N_API GregorianCalendar: public Calendar {
   150 public:
   152     /**
   153      * Useful constants for GregorianCalendar and TimeZone.
   154      * @stable ICU 2.0
   155      */
   156     enum EEras {
   157         BC,
   158         AD
   159     };
   161     /**
   162      * Constructs a default GregorianCalendar using the current time in the default time
   163      * zone with the default locale.
   164      *
   165      * @param success  Indicates the status of GregorianCalendar object construction.
   166      *                 Returns U_ZERO_ERROR if constructed successfully.
   167      * @stable ICU 2.0
   168      */
   169     GregorianCalendar(UErrorCode& success);
   171     /**
   172      * Constructs a GregorianCalendar based on the current time in the given time zone
   173      * with the default locale. Clients are no longer responsible for deleting the given
   174      * time zone object after it's adopted.
   175      *
   176      * @param zoneToAdopt     The given timezone.
   177      * @param success  Indicates the status of GregorianCalendar object construction.
   178      *                 Returns U_ZERO_ERROR if constructed successfully.
   179      * @stable ICU 2.0
   180      */
   181     GregorianCalendar(TimeZone* zoneToAdopt, UErrorCode& success);
   183     /**
   184      * Constructs a GregorianCalendar based on the current time in the given time zone
   185      * with the default locale.
   186      *
   187      * @param zone     The given timezone.
   188      * @param success  Indicates the status of GregorianCalendar object construction.
   189      *                 Returns U_ZERO_ERROR if constructed successfully.
   190      * @stable ICU 2.0
   191      */
   192     GregorianCalendar(const TimeZone& zone, UErrorCode& success);
   194     /**
   195      * Constructs a GregorianCalendar based on the current time in the default time zone
   196      * with the given locale.
   197      *
   198      * @param aLocale  The given locale.
   199      * @param success  Indicates the status of GregorianCalendar object construction.
   200      *                 Returns U_ZERO_ERROR if constructed successfully.
   201      * @stable ICU 2.0
   202      */
   203     GregorianCalendar(const Locale& aLocale, UErrorCode& success);
   205     /**
   206      * Constructs a GregorianCalendar based on the current time in the given time zone
   207      * with the given locale. Clients are no longer responsible for deleting the given
   208      * time zone object after it's adopted.
   209      *
   210      * @param zoneToAdopt     The given timezone.
   211      * @param aLocale  The given locale.
   212      * @param success  Indicates the status of GregorianCalendar object construction.
   213      *                 Returns U_ZERO_ERROR if constructed successfully.
   214      * @stable ICU 2.0
   215      */
   216     GregorianCalendar(TimeZone* zoneToAdopt, const Locale& aLocale, UErrorCode& success);
   218     /**
   219      * Constructs a GregorianCalendar based on the current time in the given time zone
   220      * with the given locale.
   221      *
   222      * @param zone     The given timezone.
   223      * @param aLocale  The given locale.
   224      * @param success  Indicates the status of GregorianCalendar object construction.
   225      *                 Returns U_ZERO_ERROR if constructed successfully.
   226      * @stable ICU 2.0
   227      */
   228     GregorianCalendar(const TimeZone& zone, const Locale& aLocale, UErrorCode& success);
   230     /**
   231      * Constructs a GregorianCalendar with the given AD date set in the default time
   232      * zone with the default locale.
   233      *
   234      * @param year     The value used to set the YEAR time field in the calendar.
   235      * @param month    The value used to set the MONTH time field in the calendar. Month
   236      *                 value is 0-based. e.g., 0 for January.
   237      * @param date     The value used to set the DATE time field in the calendar.
   238      * @param success  Indicates the status of GregorianCalendar object construction.
   239      *                 Returns U_ZERO_ERROR if constructed successfully.
   240      * @stable ICU 2.0
   241      */
   242     GregorianCalendar(int32_t year, int32_t month, int32_t date, UErrorCode& success);
   244     /**
   245      * Constructs a GregorianCalendar with the given AD date and time set for the
   246      * default time zone with the default locale.
   247      *
   248      * @param year     The value used to set the YEAR time field in the calendar.
   249      * @param month    The value used to set the MONTH time field in the calendar. Month
   250      *                 value is 0-based. e.g., 0 for January.
   251      * @param date     The value used to set the DATE time field in the calendar.
   252      * @param hour     The value used to set the HOUR_OF_DAY time field in the calendar.
   253      * @param minute   The value used to set the MINUTE time field in the calendar.
   254      * @param success  Indicates the status of GregorianCalendar object construction.
   255      *                 Returns U_ZERO_ERROR if constructed successfully.
   256      * @stable ICU 2.0
   257      */
   258     GregorianCalendar(int32_t year, int32_t month, int32_t date, int32_t hour, int32_t minute, UErrorCode& success);
   260     /**
   261      * Constructs a GregorianCalendar with the given AD date and time set for the
   262      * default time zone with the default locale.
   263      *
   264      * @param year     The value used to set the YEAR time field in the calendar.
   265      * @param month    The value used to set the MONTH time field in the calendar. Month
   266      *                 value is 0-based. e.g., 0 for January.
   267      * @param date     The value used to set the DATE time field in the calendar.
   268      * @param hour     The value used to set the HOUR_OF_DAY time field in the calendar.
   269      * @param minute   The value used to set the MINUTE time field in the calendar.
   270      * @param second   The value used to set the SECOND time field in the calendar.
   271      * @param success  Indicates the status of GregorianCalendar object construction.
   272      *                 Returns U_ZERO_ERROR if constructed successfully.
   273      * @stable ICU 2.0
   274      */
   275     GregorianCalendar(int32_t year, int32_t month, int32_t date, int32_t hour, int32_t minute, int32_t second, UErrorCode& success);
   277     /**
   278      * Destructor
   279      * @stable ICU 2.0
   280      */
   281     virtual ~GregorianCalendar();
   283     /**
   284      * Copy constructor
   285      * @param source    the object to be copied.
   286      * @stable ICU 2.0
   287      */
   288     GregorianCalendar(const GregorianCalendar& source);
   290     /**
   291      * Default assignment operator
   292      * @param right    the object to be copied.
   293      * @stable ICU 2.0
   294      */
   295     GregorianCalendar& operator=(const GregorianCalendar& right);
   297     /**
   298      * Create and return a polymorphic copy of this calendar.
   299      * @return    return a polymorphic copy of this calendar.
   300      * @stable ICU 2.0
   301      */
   302     virtual Calendar* clone(void) const;
   304     /**
   305      * Sets the GregorianCalendar change date. This is the point when the switch from
   306      * Julian dates to Gregorian dates occurred. Default is 00:00:00 local time, October
   307      * 15, 1582. Previous to this time and date will be Julian dates.
   308      *
   309      * @param date     The given Gregorian cutover date.
   310      * @param success  Output param set to success/failure code on exit.
   311      * @stable ICU 2.0
   312      */
   313     void setGregorianChange(UDate date, UErrorCode& success);
   315     /**
   316      * Gets the Gregorian Calendar change date. This is the point when the switch from
   317      * Julian dates to Gregorian dates occurred. Default is 00:00:00 local time, October
   318      * 15, 1582. Previous to this time and date will be Julian dates.
   319      *
   320      * @return   The Gregorian cutover time for this calendar.
   321      * @stable ICU 2.0
   322      */
   323     UDate getGregorianChange(void) const;
   325     /**
   326      * Return true if the given year is a leap year. Determination of whether a year is
   327      * a leap year is actually very complicated. We do something crude and mostly
   328      * correct here, but for a real determination you need a lot of contextual
   329      * information. For example, in Sweden, the change from Julian to Gregorian happened
   330      * in a complex way resulting in missed leap years and double leap years between
   331      * 1700 and 1753. Another example is that after the start of the Julian calendar in
   332      * 45 B.C., the leap years did not regularize until 8 A.D. This method ignores these
   333      * quirks, and pays attention only to the Julian onset date and the Gregorian
   334      * cutover (which can be changed).
   335      *
   336      * @param year  The given year.
   337      * @return      True if the given year is a leap year; false otherwise.
   338      * @stable ICU 2.0
   339      */
   340     UBool isLeapYear(int32_t year) const;
   342     /**
   343      * Returns TRUE if the given Calendar object is equivalent to this
   344      * one.  Calendar override.
   345      *
   346      * @param other the Calendar to be compared with this Calendar   
   347      * @stable ICU 2.4
   348      */
   349     virtual UBool isEquivalentTo(const Calendar& other) const;
   351     /**
   352      * (Overrides Calendar) Rolls up or down by the given amount in the specified field.
   353      * For more information, see the documentation for Calendar::roll().
   354      *
   355      * @param field   The time field.
   356      * @param amount  Indicates amount to roll.
   357      * @param status  Output param set to success/failure code on exit. If any value
   358      *                previously set in the time field is invalid, this will be set to
   359      *                an error status.
   360      * @deprecated ICU 2.6. Use roll(UCalendarDateFields field, int32_t amount, UErrorCode& status) instead.
   361      */
   362     virtual void roll(EDateFields field, int32_t amount, UErrorCode& status);
   364     /**
   365      * (Overrides Calendar) Rolls up or down by the given amount in the specified field.
   366      * For more information, see the documentation for Calendar::roll().
   367      *
   368      * @param field   The time field.
   369      * @param amount  Indicates amount to roll.
   370      * @param status  Output param set to success/failure code on exit. If any value
   371      *                previously set in the time field is invalid, this will be set to
   372      *                an error status.
   373      * @stable ICU 2.6.
   374      */
   375     virtual void roll(UCalendarDateFields field, int32_t amount, UErrorCode& status);
   377 #ifndef U_HIDE_DEPRECATED_API
   378     /**
   379      * Return the minimum value that this field could have, given the current date.
   380      * For the Gregorian calendar, this is the same as getMinimum() and getGreatestMinimum().
   381      * @param field    the time field.
   382      * @return         the minimum value that this field could have, given the current date.
   383      * @deprecated ICU 2.6. Use getActualMinimum(UCalendarDateFields field) instead.
   384      */
   385     int32_t getActualMinimum(EDateFields field) const;
   387     /**
   388      * Return the minimum value that this field could have, given the current date.
   389      * For the Gregorian calendar, this is the same as getMinimum() and getGreatestMinimum().
   390      * @param field    the time field.
   391      * @param status
   392      * @return         the minimum value that this field could have, given the current date.
   393      * @deprecated ICU 2.6. Use getActualMinimum(UCalendarDateFields field) instead. (Added to ICU 3.0 for signature consistency)
   394      */
   395     int32_t getActualMinimum(EDateFields field, UErrorCode& status) const;
   396 #endif  /* U_HIDE_DEPRECATED_API */
   398     /**
   399      * Return the minimum value that this field could have, given the current date.
   400      * For the Gregorian calendar, this is the same as getMinimum() and getGreatestMinimum().
   401      * @param field    the time field.
   402      * @param status   error result.
   403      * @return         the minimum value that this field could have, given the current date.
   404      * @stable ICU 3.0
   405      */
   406     int32_t getActualMinimum(UCalendarDateFields field, UErrorCode &status) const;
   408 #ifndef U_HIDE_DEPRECATED_API
   409     /**
   410      * Return the maximum value that this field could have, given the current date.
   411      * For example, with the date "Feb 3, 1997" and the DAY_OF_MONTH field, the actual
   412      * maximum would be 28; for "Feb 3, 1996" it s 29.  Similarly for a Hebrew calendar,
   413      * for some years the actual maximum for MONTH is 12, and for others 13.
   414      * @param field    the time field.
   415      * @return         the maximum value that this field could have, given the current date.
   416      * @deprecated ICU 2.6. Use getActualMaximum(UCalendarDateFields field) instead.
   417      */
   418     int32_t getActualMaximum(EDateFields field) const;
   419 #endif  /* U_HIDE_DEPRECATED_API */
   421     /**
   422      * Return the maximum value that this field could have, given the current date.
   423      * For example, with the date "Feb 3, 1997" and the DAY_OF_MONTH field, the actual
   424      * maximum would be 28; for "Feb 3, 1996" it s 29.  Similarly for a Hebrew calendar,
   425      * for some years the actual maximum for MONTH is 12, and for others 13.
   426      * @param field    the time field.
   427      * @param status   returns any errors that may result from this function call.
   428      * @return         the maximum value that this field could have, given the current date.
   429      * @stable ICU 2.6
   430      */
   431     virtual int32_t getActualMaximum(UCalendarDateFields field, UErrorCode& status) const;
   433     /**
   434      * (Overrides Calendar) Return true if the current date for this Calendar is in
   435      * Daylight Savings Time. Recognizes DST_OFFSET, if it is set.
   436      *
   437      * @param status Fill-in parameter which receives the status of this operation.
   438      * @return   True if the current date for this Calendar is in Daylight Savings Time,
   439      *           false, otherwise.
   440      * @stable ICU 2.0
   441      */
   442     virtual UBool inDaylightTime(UErrorCode& status) const;
   444 public:
   446     /**
   447      * Override Calendar Returns a unique class ID POLYMORPHICALLY. Pure virtual
   448      * override. This method is to implement a simple version of RTTI, since not all C++
   449      * compilers support genuine RTTI. Polymorphic operator==() and clone() methods call
   450      * this method.
   451      *
   452      * @return   The class ID for this object. All objects of a given class have the
   453      *           same class ID. Objects of other classes have different class IDs.
   454      * @stable ICU 2.0
   455      */
   456     virtual UClassID getDynamicClassID(void) const;
   458     /**
   459      * Return the class ID for this class. This is useful only for comparing to a return
   460      * value from getDynamicClassID(). For example:
   461      *
   462      *      Base* polymorphic_pointer = createPolymorphicObject();
   463      *      if (polymorphic_pointer->getDynamicClassID() ==
   464      *          Derived::getStaticClassID()) ...
   465      *
   466      * @return   The class ID for all objects of this class.
   467      * @stable ICU 2.0
   468      */
   469     static UClassID U_EXPORT2 getStaticClassID(void);
   471     /**
   472      * Returns the calendar type name string for this Calendar object.
   473      * The returned string is the legacy ICU calendar attribute value,
   474      * for example, "gregorian" or "japanese".
   475      *
   476      * For more details see the Calendar::getType() documentation.
   477      *
   478      * @return legacy calendar type name string
   479      * @stable ICU 49
   480      */
   481     virtual const char * getType() const;
   483  private:
   484     GregorianCalendar(); // default constructor not implemented
   486  protected:
   487     /**
   488      * Return the ERA.  We need a special method for this because the
   489      * default ERA is AD, but a zero (unset) ERA is BC.
   490      * @return    the ERA.
   491      * @internal
   492      */
   493     virtual int32_t internalGetEra() const;
   495     /**
   496      * Return the Julian day number of day before the first day of the
   497      * given month in the given extended year.  Subclasses should override
   498      * this method to implement their calendar system.
   499      * @param eyear the extended year
   500      * @param month the zero-based month, or 0 if useMonth is false
   501      * @param useMonth if false, compute the day before the first day of
   502      * the given year, otherwise, compute the day before the first day of
   503      * the given month
   504      * @return the Julian day number of the day before the first
   505      * day of the given month and year
   506      * @internal
   507      */
   508     virtual int32_t handleComputeMonthStart(int32_t eyear, int32_t month,
   509                                                    UBool useMonth) const;
   511     /**
   512      * Subclasses may override this.  This method calls
   513      * handleGetMonthLength() to obtain the calendar-specific month
   514      * length.
   515      * @param bestField which field to use to calculate the date 
   516      * @return julian day specified by calendar fields.
   517      * @internal
   518      */
   519     virtual int32_t handleComputeJulianDay(UCalendarDateFields bestField)  ;
   521     /**
   522      * Return the number of days in the given month of the given extended
   523      * year of this calendar system.  Subclasses should override this
   524      * method if they can provide a more correct or more efficient
   525      * implementation than the default implementation in Calendar.
   526      * @internal
   527      */
   528     virtual int32_t handleGetMonthLength(int32_t extendedYear, int32_t month) const;
   530     /**
   531      * Return the number of days in the given extended year of this
   532      * calendar system.  Subclasses should override this method if they can
   533      * provide a more correct or more efficient implementation than the
   534      * default implementation in Calendar.
   535      * @stable ICU 2.0
   536      */
   537     virtual int32_t handleGetYearLength(int32_t eyear) const;
   539     /**
   540      * return the length of the given month.
   541      * @param month    the given month.
   542      * @return    the length of the given month.
   543      * @internal
   544      */
   545     virtual int32_t monthLength(int32_t month) const;
   547     /**
   548      * return the length of the month according to the given year.
   549      * @param month    the given month.
   550      * @param year     the given year.
   551      * @return         the length of the month
   552      * @internal
   553      */
   554     virtual int32_t monthLength(int32_t month, int32_t year) const;
   556 #ifndef U_HIDE_INTERNAL_API
   557     /**
   558      * return the length of the given year.
   559      * @param year    the given year.
   560      * @return        the length of the given year.
   561      * @internal
   562      */
   563     int32_t yearLength(int32_t year) const;
   565     /**
   566      * return the length of the year field.
   567      * @return    the length of the year field
   568      * @internal
   569      */
   570     int32_t yearLength(void) const;
   572     /**
   573      * After adjustments such as add(MONTH), add(YEAR), we don't want the
   574      * month to jump around.  E.g., we don't want Jan 31 + 1 month to go to Mar
   575      * 3, we want it to go to Feb 28.  Adjustments which might run into this
   576      * problem call this method to retain the proper month.
   577      * @internal
   578      */
   579     void pinDayOfMonth(void);
   580 #endif  /* U_HIDE_INTERNAL_API */
   582     /**
   583      * Return the day number with respect to the epoch.  January 1, 1970 (Gregorian)
   584      * is day zero.
   585      * @param status Fill-in parameter which receives the status of this operation.
   586      * @return       the day number with respect to the epoch.  
   587      * @internal
   588      */
   589     virtual UDate getEpochDay(UErrorCode& status);
   591     /**
   592      * Subclass API for defining limits of different types.
   593      * Subclasses must implement this method to return limits for the
   594      * following fields:
   595      *
   596      * <pre>UCAL_ERA
   597      * UCAL_YEAR
   598      * UCAL_MONTH
   599      * UCAL_WEEK_OF_YEAR
   600      * UCAL_WEEK_OF_MONTH
   601      * UCAL_DATE (DAY_OF_MONTH on Java)
   602      * UCAL_DAY_OF_YEAR
   603      * UCAL_DAY_OF_WEEK_IN_MONTH
   604      * UCAL_YEAR_WOY
   605      * UCAL_EXTENDED_YEAR</pre>
   606      *
   607      * @param field one of the above field numbers
   608      * @param limitType one of <code>MINIMUM</code>, <code>GREATEST_MINIMUM</code>,
   609      * <code>LEAST_MAXIMUM</code>, or <code>MAXIMUM</code>
   610      * @internal
   611      */
   612     virtual int32_t handleGetLimit(UCalendarDateFields field, ELimitType limitType) const;
   614     /**
   615      * Return the extended year defined by the current fields.  This will
   616      * use the UCAL_EXTENDED_YEAR field or the UCAL_YEAR and supra-year fields (such
   617      * as UCAL_ERA) specific to the calendar system, depending on which set of
   618      * fields is newer.
   619      * @return the extended year
   620      * @internal
   621      */
   622     virtual int32_t handleGetExtendedYear();
   624     /** 
   625      * Subclasses may override this to convert from week fields 
   626      * (YEAR_WOY and WEEK_OF_YEAR) to an extended year in the case
   627      * where YEAR, EXTENDED_YEAR are not set.
   628      * The Gregorian implementation assumes a yearWoy in gregorian format, according to the current era.
   629      * @return the extended year, UCAL_EXTENDED_YEAR
   630      * @internal
   631      */
   632     virtual int32_t handleGetExtendedYearFromWeekFields(int32_t yearWoy, int32_t woy);
   635     /**
   636      * Subclasses may override this method to compute several fields
   637      * specific to each calendar system.  These are:
   638      *
   639      * <ul><li>ERA
   640      * <li>YEAR
   641      * <li>MONTH
   642      * <li>DAY_OF_MONTH
   643      * <li>DAY_OF_YEAR
   644      * <li>EXTENDED_YEAR</ul>
   645      *
   646      * <p>The GregorianCalendar implementation implements
   647      * a calendar with the specified Julian/Gregorian cutover date.
   648      * @internal
   649      */
   650     virtual void handleComputeFields(int32_t julianDay, UErrorCode &status);
   652  private:
   653     /**
   654      * Compute the julian day number of the given year.
   655      * @param isGregorian    if true, using Gregorian calendar, otherwise using Julian calendar
   656      * @param year           the given year.
   657      * @param isLeap         true if the year is a leap year.       
   658      * @return 
   659      */
   660     static double computeJulianDayOfYear(UBool isGregorian, int32_t year,
   661                                          UBool& isLeap);
   663     /**
   664      * Validates the values of the set time fields.  True if they're all valid.
   665      * @return    True if the set time fields are all valid.
   666      */
   667     UBool validateFields(void) const;
   669     /**
   670      * Validates the value of the given time field.  True if it's valid.
   671      */
   672     UBool boundsCheck(int32_t value, UCalendarDateFields field) const;
   674     /**
   675      * Return the pseudo-time-stamp for two fields, given their
   676      * individual pseudo-time-stamps.  If either of the fields
   677      * is unset, then the aggregate is unset.  Otherwise, the
   678      * aggregate is the later of the two stamps.
   679      * @param stamp_a    One given field.
   680      * @param stamp_b    Another given field.
   681      * @return the pseudo-time-stamp for two fields
   682      */
   683     int32_t aggregateStamp(int32_t stamp_a, int32_t stamp_b);
   685     /**
   686      * The point at which the Gregorian calendar rules are used, measured in
   687      * milliseconds from the standard epoch.  Default is October 15, 1582
   688      * (Gregorian) 00:00:00 UTC, that is, October 4, 1582 (Julian) is followed
   689      * by October 15, 1582 (Gregorian).  This corresponds to Julian day number
   690      * 2299161. This is measured from the standard epoch, not in Julian Days.
   691      */
   692     UDate                fGregorianCutover;
   694     /**
   695      * Julian day number of the Gregorian cutover
   696      */
   697     int32_t             fCutoverJulianDay;
   699     /**
   700      * Midnight, local time (using this Calendar's TimeZone) at or before the
   701      * gregorianCutover. This is a pure date value with no time of day or
   702      * timezone component.
   703      */
   704     UDate                 fNormalizedGregorianCutover;// = gregorianCutover;
   706     /**
   707      * The year of the gregorianCutover, with 0 representing
   708      * 1 BC, -1 representing 2 BC, etc.
   709      */
   710     int32_t fGregorianCutoverYear;// = 1582;
   712     /**
   713      * The year of the gregorianCutover, with 0 representing
   714      * 1 BC, -1 representing 2 BC, etc.
   715      */
   716     int32_t fGregorianCutoverJulianDay;// = 2299161;
   718     /**
   719      * Converts time as milliseconds to Julian date. The Julian date used here is not a
   720      * true Julian date, since it is measured from midnight, not noon.
   721      *
   722      * @param millis  The given milliseconds.
   723      * @return        The Julian date number.
   724      */
   725     static double millisToJulianDay(UDate millis);
   727     /**
   728      * Converts Julian date to time as milliseconds. The Julian date used here is not a
   729      * true Julian date, since it is measured from midnight, not noon.
   730      *
   731      * @param julian  The given Julian date number.
   732      * @return        Time as milliseconds.
   733      */
   734     static UDate julianDayToMillis(double julian);
   736     /**
   737      * Used by handleComputeJulianDay() and handleComputeMonthStart().
   738      * Temporary field indicating whether the calendar is currently Gregorian as opposed to Julian.
   739      */
   740     UBool fIsGregorian;
   742     /**
   743      * Used by handleComputeJulianDay() and handleComputeMonthStart().
   744      * Temporary field indicating that the sense of the gregorian cutover should be inverted
   745      * to handle certain calculations on and around the cutover date.
   746      */
   747     UBool fInvertGregorian;
   750  public: // internal implementation
   752     /**
   753      * @return TRUE if this calendar has the notion of a default century
   754      * @internal 
   755      */
   756     virtual UBool haveDefaultCentury() const;
   758     /**
   759      * @return the start of the default century
   760      * @internal
   761      */
   762     virtual UDate defaultCenturyStart() const;
   764     /**
   765      * @return the beginning year of the default century
   766      * @internal 
   767      */
   768     virtual int32_t defaultCenturyStartYear() const;
   769 };
   771 U_NAMESPACE_END
   773 #endif /* #if !UCONFIG_NO_FORMATTING */
   775 #endif // _GREGOCAL
   776 //eof

mercurial