tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

gregocal.h (30770B)


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