16f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*
26f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* Copyright (C) 1997-2013, International Business Machines Corporation and others.
36f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* All Rights Reserved.
46f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org********************************************************************************
56f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*
66f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* File GREGOCAL.H
76f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*
86f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* Modification History:
96f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*
106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*   Date        Name        Description
116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*   04/22/97    aliu        Overhauled header.
126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*    07/28/98    stephen        Sync with JDK 1.2
136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*    09/04/98    stephen        Re-sync with JDK 8/31 putback
146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*    09/14/98    stephen        Changed type of kOneDay, kOneWeek to double.
156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*                            Fixed bug in roll()
166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*   10/15/99    aliu        Fixed j31, incorrect WEEK_OF_YEAR computation.
176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*                           Added documentation of WEEK_OF_YEAR computation.
186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*   10/15/99    aliu        Fixed j32, cannot set date to Feb 29 2000 AD.
196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*                           {JDK bug 4210209 4209272}
206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*   11/07/2003  srl         Update, clean up documentation.
216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org********************************************************************************
226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*/
236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#ifndef GREGOCAL_H
256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define GREGOCAL_H
266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/utypes.h"
286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if !UCONFIG_NO_FORMATTING
306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/calendar.h"
326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/**
346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * \file
356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * \brief C++ API: Concrete class which provides the standard calendar.
366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */
376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_NAMESPACE_BEGIN
396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/**
416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Concrete class which provides the standard calendar used by most of the world.
426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <P>
436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * The standard (Gregorian) calendar has 2 eras, BC and AD.
446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <P>
456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * This implementation handles a single discontinuity, which corresponds by default to
466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * the date the Gregorian calendar was originally instituted (October 15, 1582). Not all
476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * countries adopted the Gregorian calendar then, so this cutover date may be changed by
486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * the caller.
496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <P>
506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Prior to the institution of the Gregorian Calendar, New Year's Day was March 25. To
516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * avoid confusion, this Calendar always uses January 1. A manual adjustment may be made
526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * if desired for dates that are prior to the Gregorian changeover and which fall
536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * between January 1 and March 24.
546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *
556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <p>Values calculated for the <code>WEEK_OF_YEAR</code> field range from 1 to
566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 53.  Week 1 for a year is the first week that contains at least
576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <code>getMinimalDaysInFirstWeek()</code> days from that year.  It thus
586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * depends on the values of <code>getMinimalDaysInFirstWeek()</code>,
596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <code>getFirstDayOfWeek()</code>, and the day of the week of January 1.
606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Weeks between week 1 of one year and week 1 of the following year are
616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * numbered sequentially from 2 to 52 or 53 (as needed).
626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *
636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <p>For example, January 1, 1998 was a Thursday.  If
646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <code>getFirstDayOfWeek()</code> is <code>MONDAY</code> and
656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <code>getMinimalDaysInFirstWeek()</code> is 4 (these are the values
666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * reflecting ISO 8601 and many national standards), then week 1 of 1998 starts
676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * on December 29, 1997, and ends on January 4, 1998.  If, however,
686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <code>getFirstDayOfWeek()</code> is <code>SUNDAY</code>, then week 1 of 1998
696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * starts on January 4, 1998, and ends on January 10, 1998; the first three days
706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * of 1998 then are part of week 53 of 1997.
716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *
726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <p>Example for using GregorianCalendar:
736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <pre>
746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * \code
756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *     // get the supported ids for GMT-08:00 (Pacific Standard Time)
766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *     UErrorCode success = U_ZERO_ERROR;
776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *     const StringEnumeration *ids = TimeZone::createEnumeration(-8 * 60 * 60 * 1000);
786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *     // if no ids were returned, something is wrong. get out.
796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *     if (ids == 0 || ids->count(success) == 0) {
806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *         return;
816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *     }
826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *
836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *     // begin output
846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *     cout << "Current Time" << endl;
856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *
866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *     // create a Pacific Standard Time time zone
876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *     SimpleTimeZone* pdt = new SimpleTimeZone(-8 * 60 * 60 * 1000, ids->unext(NULL, success)));
886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *
896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *     // set up rules for daylight savings time
906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *     pdt->setStartRule(UCAL_MARCH, 1, UCAL_SUNDAY, 2 * 60 * 60 * 1000);
916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *     pdt->setEndRule(UCAL_NOVEMBER, 2, UCAL_SUNDAY, 2 * 60 * 60 * 1000);
926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *
936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *     // create a GregorianCalendar with the Pacific Daylight time zone
946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *     // and the current date and time
956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *     Calendar* calendar = new GregorianCalendar( pdt, success );
966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *
976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *     // print out a bunch of interesting things
986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *     cout << "ERA: " << calendar->get( UCAL_ERA, success ) << endl;
996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *     cout << "YEAR: " << calendar->get( UCAL_YEAR, success ) << endl;
1006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *     cout << "MONTH: " << calendar->get( UCAL_MONTH, success ) << endl;
1016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *     cout << "WEEK_OF_YEAR: " << calendar->get( UCAL_WEEK_OF_YEAR, success ) << endl;
1026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *     cout << "WEEK_OF_MONTH: " << calendar->get( UCAL_WEEK_OF_MONTH, success ) << endl;
1036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *     cout << "DATE: " << calendar->get( UCAL_DATE, success ) << endl;
1046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *     cout << "DAY_OF_MONTH: " << calendar->get( UCAL_DAY_OF_MONTH, success ) << endl;
1056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *     cout << "DAY_OF_YEAR: " << calendar->get( UCAL_DAY_OF_YEAR, success ) << endl;
1066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *     cout << "DAY_OF_WEEK: " << calendar->get( UCAL_DAY_OF_WEEK, success ) << endl;
1076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *     cout << "DAY_OF_WEEK_IN_MONTH: " << calendar->get( UCAL_DAY_OF_WEEK_IN_MONTH, success ) << endl;
1086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *     cout << "AM_PM: " << calendar->get( UCAL_AM_PM, success ) << endl;
1096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *     cout << "HOUR: " << calendar->get( UCAL_HOUR, success ) << endl;
1106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *     cout << "HOUR_OF_DAY: " << calendar->get( UCAL_HOUR_OF_DAY, success ) << endl;
1116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *     cout << "MINUTE: " << calendar->get( UCAL_MINUTE, success ) << endl;
1126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *     cout << "SECOND: " << calendar->get( UCAL_SECOND, success ) << endl;
1136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *     cout << "MILLISECOND: " << calendar->get( UCAL_MILLISECOND, success ) << endl;
1146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *     cout << "ZONE_OFFSET: " << (calendar->get( UCAL_ZONE_OFFSET, success )/(60*60*1000)) << endl;
1156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *     cout << "DST_OFFSET: " << (calendar->get( UCAL_DST_OFFSET, success )/(60*60*1000)) << endl;
1166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *
1176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *     cout << "Current Time, with hour reset to 3" << endl;
1186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *     calendar->clear(UCAL_HOUR_OF_DAY); // so doesn't override
1196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *     calendar->set(UCAL_HOUR, 3);
1206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *     cout << "ERA: " << calendar->get( UCAL_ERA, success ) << endl;
1216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *     cout << "YEAR: " << calendar->get( UCAL_YEAR, success ) << endl;
1226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *     cout << "MONTH: " << calendar->get( UCAL_MONTH, success ) << endl;
1236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *     cout << "WEEK_OF_YEAR: " << calendar->get( UCAL_WEEK_OF_YEAR, success ) << endl;
1246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *     cout << "WEEK_OF_MONTH: " << calendar->get( UCAL_WEEK_OF_MONTH, success ) << endl;
1256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *     cout << "DATE: " << calendar->get( UCAL_DATE, success ) << endl;
1266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *     cout << "DAY_OF_MONTH: " << calendar->get( UCAL_DAY_OF_MONTH, success ) << endl;
1276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *     cout << "DAY_OF_YEAR: " << calendar->get( UCAL_DAY_OF_YEAR, success ) << endl;
1286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *     cout << "DAY_OF_WEEK: " << calendar->get( UCAL_DAY_OF_WEEK, success ) << endl;
1296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *     cout << "DAY_OF_WEEK_IN_MONTH: " << calendar->get( UCAL_DAY_OF_WEEK_IN_MONTH, success ) << endl;
1306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *     cout << "AM_PM: " << calendar->get( UCAL_AM_PM, success ) << endl;
1316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *     cout << "HOUR: " << calendar->get( UCAL_HOUR, success ) << endl;
1326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *     cout << "HOUR_OF_DAY: " << calendar->get( UCAL_HOUR_OF_DAY, success ) << endl;
1336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *     cout << "MINUTE: " << calendar->get( UCAL_MINUTE, success ) << endl;
1346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *     cout << "SECOND: " << calendar->get( UCAL_SECOND, success ) << endl;
1356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *     cout << "MILLISECOND: " << calendar->get( UCAL_MILLISECOND, success ) << endl;
1366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *     cout << "ZONE_OFFSET: " << (calendar->get( UCAL_ZONE_OFFSET, success )/(60*60*1000)) << endl; // in hours
1376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *     cout << "DST_OFFSET: " << (calendar->get( UCAL_DST_OFFSET, success )/(60*60*1000)) << endl; // in hours
1386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *
1396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *     if (U_FAILURE(success)) {
1406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *         cout << "An error occured. success=" << u_errorName(success) << endl;
1416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *     }
1426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *
1436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *     delete ids;
1446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *     delete calendar; // also deletes pdt
1456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * \endcode
1466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * </pre>
1476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @stable ICU 2.0
1486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */
1496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgclass U_I18N_API GregorianCalendar: public Calendar {
1506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgpublic:
1516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
1536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Useful constants for GregorianCalendar and TimeZone.
1546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.0
1556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
1566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    enum EEras {
1576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        BC,
1586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        AD
1596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    };
1606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
1626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Constructs a default GregorianCalendar using the current time in the default time
1636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * zone with the default locale.
1646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *
1656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param success  Indicates the status of GregorianCalendar object construction.
1666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *                 Returns U_ZERO_ERROR if constructed successfully.
1676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.0
1686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
1696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    GregorianCalendar(UErrorCode& success);
1706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
1726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Constructs a GregorianCalendar based on the current time in the given time zone
1736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * with the default locale. Clients are no longer responsible for deleting the given
1746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * time zone object after it's adopted.
1756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *
1766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param zoneToAdopt     The given timezone.
1776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param success  Indicates the status of GregorianCalendar object construction.
1786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *                 Returns U_ZERO_ERROR if constructed successfully.
1796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.0
1806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
1816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    GregorianCalendar(TimeZone* zoneToAdopt, UErrorCode& success);
1826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
1846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Constructs a GregorianCalendar based on the current time in the given time zone
1856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * with the default locale.
1866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *
1876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param zone     The given timezone.
1886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param success  Indicates the status of GregorianCalendar object construction.
1896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *                 Returns U_ZERO_ERROR if constructed successfully.
1906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.0
1916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
1926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    GregorianCalendar(const TimeZone& zone, UErrorCode& success);
1936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
1956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Constructs a GregorianCalendar based on the current time in the default time zone
1966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * with the given locale.
1976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *
1986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param aLocale  The given locale.
1996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param success  Indicates the status of GregorianCalendar object construction.
2006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *                 Returns U_ZERO_ERROR if constructed successfully.
2016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.0
2026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
2036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    GregorianCalendar(const Locale& aLocale, UErrorCode& success);
2046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
2066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Constructs a GregorianCalendar based on the current time in the given time zone
2076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * with the given locale. Clients are no longer responsible for deleting the given
2086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * time zone object after it's adopted.
2096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *
2106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param zoneToAdopt     The given timezone.
2116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param aLocale  The given locale.
2126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param success  Indicates the status of GregorianCalendar object construction.
2136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *                 Returns U_ZERO_ERROR if constructed successfully.
2146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.0
2156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
2166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    GregorianCalendar(TimeZone* zoneToAdopt, const Locale& aLocale, UErrorCode& success);
2176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
2196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Constructs a GregorianCalendar based on the current time in the given time zone
2206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * with the given locale.
2216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *
2226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param zone     The given timezone.
2236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param aLocale  The given locale.
2246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param success  Indicates the status of GregorianCalendar object construction.
2256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *                 Returns U_ZERO_ERROR if constructed successfully.
2266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.0
2276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
2286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    GregorianCalendar(const TimeZone& zone, const Locale& aLocale, UErrorCode& success);
2296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
2316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Constructs a GregorianCalendar with the given AD date set in the default time
2326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * zone with the default locale.
2336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *
2346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param year     The value used to set the YEAR time field in the calendar.
2356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param month    The value used to set the MONTH time field in the calendar. Month
2366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *                 value is 0-based. e.g., 0 for January.
2376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param date     The value used to set the DATE time field in the calendar.
2386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param success  Indicates the status of GregorianCalendar object construction.
2396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *                 Returns U_ZERO_ERROR if constructed successfully.
2406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.0
2416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
2426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    GregorianCalendar(int32_t year, int32_t month, int32_t date, UErrorCode& success);
2436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
2456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Constructs a GregorianCalendar with the given AD date and time set for the
2466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * default time zone with the default locale.
2476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *
2486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param year     The value used to set the YEAR time field in the calendar.
2496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param month    The value used to set the MONTH time field in the calendar. Month
2506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *                 value is 0-based. e.g., 0 for January.
2516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param date     The value used to set the DATE time field in the calendar.
2526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param hour     The value used to set the HOUR_OF_DAY time field in the calendar.
2536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param minute   The value used to set the MINUTE time field in the calendar.
2546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param success  Indicates the status of GregorianCalendar object construction.
2556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *                 Returns U_ZERO_ERROR if constructed successfully.
2566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.0
2576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
2586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    GregorianCalendar(int32_t year, int32_t month, int32_t date, int32_t hour, int32_t minute, UErrorCode& success);
2596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
2616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Constructs a GregorianCalendar with the given AD date and time set for the
2626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * default time zone with the default locale.
2636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *
2646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param year     The value used to set the YEAR time field in the calendar.
2656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param month    The value used to set the MONTH time field in the calendar. Month
2666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *                 value is 0-based. e.g., 0 for January.
2676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param date     The value used to set the DATE time field in the calendar.
2686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param hour     The value used to set the HOUR_OF_DAY time field in the calendar.
2696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param minute   The value used to set the MINUTE time field in the calendar.
2706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param second   The value used to set the SECOND time field in the calendar.
2716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param success  Indicates the status of GregorianCalendar object construction.
2726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *                 Returns U_ZERO_ERROR if constructed successfully.
2736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.0
2746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
2756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    GregorianCalendar(int32_t year, int32_t month, int32_t date, int32_t hour, int32_t minute, int32_t second, UErrorCode& success);
2766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
2786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Destructor
2796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.0
2806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
2816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    virtual ~GregorianCalendar();
2826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
2846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Copy constructor
2856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param source    the object to be copied.
2866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.0
2876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
2886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    GregorianCalendar(const GregorianCalendar& source);
2896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
2916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Default assignment operator
2926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param right    the object to be copied.
2936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.0
2946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
2956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    GregorianCalendar& operator=(const GregorianCalendar& right);
2966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
2986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Create and return a polymorphic copy of this calendar.
2996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @return    return a polymorphic copy of this calendar.
3006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.0
3016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
3026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    virtual Calendar* clone(void) const;
3036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
3056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Sets the GregorianCalendar change date. This is the point when the switch from
3066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Julian dates to Gregorian dates occurred. Default is 00:00:00 local time, October
3076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * 15, 1582. Previous to this time and date will be Julian dates.
3086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *
3096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param date     The given Gregorian cutover date.
3106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param success  Output param set to success/failure code on exit.
3116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.0
3126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
3136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    void setGregorianChange(UDate date, UErrorCode& success);
3146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
3166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Gets the Gregorian Calendar change date. This is the point when the switch from
3176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Julian dates to Gregorian dates occurred. Default is 00:00:00 local time, October
3186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * 15, 1582. Previous to this time and date will be Julian dates.
3196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *
3206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @return   The Gregorian cutover time for this calendar.
3216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.0
3226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
3236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UDate getGregorianChange(void) const;
3246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
3266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Return true if the given year is a leap year. Determination of whether a year is
3276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * a leap year is actually very complicated. We do something crude and mostly
3286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * correct here, but for a real determination you need a lot of contextual
3296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * information. For example, in Sweden, the change from Julian to Gregorian happened
3306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * in a complex way resulting in missed leap years and double leap years between
3316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * 1700 and 1753. Another example is that after the start of the Julian calendar in
3326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * 45 B.C., the leap years did not regularize until 8 A.D. This method ignores these
3336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * quirks, and pays attention only to the Julian onset date and the Gregorian
3346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * cutover (which can be changed).
3356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *
3366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param year  The given year.
3376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @return      True if the given year is a leap year; false otherwise.
3386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.0
3396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
3406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UBool isLeapYear(int32_t year) const;
3416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
3436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Returns TRUE if the given Calendar object is equivalent to this
3446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * one.  Calendar override.
3456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *
3466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param other the Calendar to be compared with this Calendar
3476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.4
3486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
3496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    virtual UBool isEquivalentTo(const Calendar& other) const;
3506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
3526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * (Overrides Calendar) Rolls up or down by the given amount in the specified field.
3536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * For more information, see the documentation for Calendar::roll().
3546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *
3556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param field   The time field.
3566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param amount  Indicates amount to roll.
3576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param status  Output param set to success/failure code on exit. If any value
3586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *                previously set in the time field is invalid, this will be set to
3596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *                an error status.
3606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @deprecated ICU 2.6. Use roll(UCalendarDateFields field, int32_t amount, UErrorCode& status) instead.
3616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
3626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    virtual void roll(EDateFields field, int32_t amount, UErrorCode& status);
3636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
3656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * (Overrides Calendar) Rolls up or down by the given amount in the specified field.
3666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * For more information, see the documentation for Calendar::roll().
3676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *
3686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param field   The time field.
3696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param amount  Indicates amount to roll.
3706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param status  Output param set to success/failure code on exit. If any value
3716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *                previously set in the time field is invalid, this will be set to
3726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *                an error status.
3736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.6.
3746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
3756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    virtual void roll(UCalendarDateFields field, int32_t amount, UErrorCode& status);
3766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#ifndef U_HIDE_DEPRECATED_API
3786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
3796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Return the minimum value that this field could have, given the current date.
3806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * For the Gregorian calendar, this is the same as getMinimum() and getGreatestMinimum().
3816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param field    the time field.
3826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @return         the minimum value that this field could have, given the current date.
3836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @deprecated ICU 2.6. Use getActualMinimum(UCalendarDateFields field) instead.
3846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
3856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t getActualMinimum(EDateFields field) const;
3866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
3886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Return the minimum value that this field could have, given the current date.
3896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * For the Gregorian calendar, this is the same as getMinimum() and getGreatestMinimum().
3906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param field    the time field.
3916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param status
3926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @return         the minimum value that this field could have, given the current date.
3936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @deprecated ICU 2.6. Use getActualMinimum(UCalendarDateFields field) instead. (Added to ICU 3.0 for signature consistency)
3946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
3956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t getActualMinimum(EDateFields field, UErrorCode& status) const;
3966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif  /* U_HIDE_DEPRECATED_API */
3976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
3996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Return the minimum value that this field could have, given the current date.
4006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * For the Gregorian calendar, this is the same as getMinimum() and getGreatestMinimum().
4016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param field    the time field.
4026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param status   error result.
4036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @return         the minimum value that this field could have, given the current date.
4046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 3.0
4056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
4066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t getActualMinimum(UCalendarDateFields field, UErrorCode &status) const;
4076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#ifndef U_HIDE_DEPRECATED_API
4096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
4106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Return the maximum value that this field could have, given the current date.
4116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * For example, with the date "Feb 3, 1997" and the DAY_OF_MONTH field, the actual
4126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * maximum would be 28; for "Feb 3, 1996" it s 29.  Similarly for a Hebrew calendar,
4136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * for some years the actual maximum for MONTH is 12, and for others 13.
4146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param field    the time field.
4156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @return         the maximum value that this field could have, given the current date.
4166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @deprecated ICU 2.6. Use getActualMaximum(UCalendarDateFields field) instead.
4176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
4186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t getActualMaximum(EDateFields field) const;
4196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif  /* U_HIDE_DEPRECATED_API */
4206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
4226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Return the maximum value that this field could have, given the current date.
4236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * For example, with the date "Feb 3, 1997" and the DAY_OF_MONTH field, the actual
4246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * maximum would be 28; for "Feb 3, 1996" it s 29.  Similarly for a Hebrew calendar,
4256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * for some years the actual maximum for MONTH is 12, and for others 13.
4266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param field    the time field.
4276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param status   returns any errors that may result from this function call.
4286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @return         the maximum value that this field could have, given the current date.
4296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.6
4306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
4316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    virtual int32_t getActualMaximum(UCalendarDateFields field, UErrorCode& status) const;
4326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
4346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * (Overrides Calendar) Return true if the current date for this Calendar is in
4356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Daylight Savings Time. Recognizes DST_OFFSET, if it is set.
4366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *
4376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param status Fill-in parameter which receives the status of this operation.
4386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @return   True if the current date for this Calendar is in Daylight Savings Time,
4396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *           false, otherwise.
4406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.0
4416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
4426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    virtual UBool inDaylightTime(UErrorCode& status) const;
4436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgpublic:
4456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
4476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Override Calendar Returns a unique class ID POLYMORPHICALLY. Pure virtual
4486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * override. This method is to implement a simple version of RTTI, since not all C++
4496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * compilers support genuine RTTI. Polymorphic operator==() and clone() methods call
4506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * this method.
4516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *
4526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @return   The class ID for this object. All objects of a given class have the
4536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *           same class ID. Objects of other classes have different class IDs.
4546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.0
4556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
4566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    virtual UClassID getDynamicClassID(void) const;
4576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
4596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Return the class ID for this class. This is useful only for comparing to a return
4606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * value from getDynamicClassID(). For example:
4616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *
4626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *      Base* polymorphic_pointer = createPolymorphicObject();
4636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *      if (polymorphic_pointer->getDynamicClassID() ==
4646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *          Derived::getStaticClassID()) ...
4656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *
4666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @return   The class ID for all objects of this class.
4676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.0
4686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
4696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static UClassID U_EXPORT2 getStaticClassID(void);
4706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
4726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Returns the calendar type name string for this Calendar object.
4736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * The returned string is the legacy ICU calendar attribute value,
4746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * for example, "gregorian" or "japanese".
4756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *
4766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * For more details see the Calendar::getType() documentation.
4776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *
4786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @return legacy calendar type name string
4796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 49
4806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
4816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    virtual const char * getType() const;
4826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org private:
4846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    GregorianCalendar(); // default constructor not implemented
4856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org protected:
4876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
4886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Return the ERA.  We need a special method for this because the
4896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * default ERA is AD, but a zero (unset) ERA is BC.
4906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @return    the ERA.
4916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @internal
4926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
4936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    virtual int32_t internalGetEra() const;
4946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
4966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Return the Julian day number of day before the first day of the
4976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * given month in the given extended year.  Subclasses should override
4986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * this method to implement their calendar system.
4996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param eyear the extended year
5006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param month the zero-based month, or 0 if useMonth is false
5016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param useMonth if false, compute the day before the first day of
5026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * the given year, otherwise, compute the day before the first day of
5036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * the given month
5046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @return the Julian day number of the day before the first
5056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * day of the given month and year
5066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @internal
5076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
5086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    virtual int32_t handleComputeMonthStart(int32_t eyear, int32_t month,
5096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                                   UBool useMonth) const;
5106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
5126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Subclasses may override this.  This method calls
5136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * handleGetMonthLength() to obtain the calendar-specific month
5146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * length.
5156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param bestField which field to use to calculate the date
5166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @return julian day specified by calendar fields.
5176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @internal
5186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
5196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    virtual int32_t handleComputeJulianDay(UCalendarDateFields bestField)  ;
5206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
5226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Return the number of days in the given month of the given extended
5236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * year of this calendar system.  Subclasses should override this
5246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * method if they can provide a more correct or more efficient
5256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * implementation than the default implementation in Calendar.
5266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @internal
5276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
5286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    virtual int32_t handleGetMonthLength(int32_t extendedYear, int32_t month) const;
5296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
5316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Return the number of days in the given extended year of this
5326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * calendar system.  Subclasses should override this method if they can
5336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * provide a more correct or more efficient implementation than the
5346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * default implementation in Calendar.
5356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.0
5366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
5376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    virtual int32_t handleGetYearLength(int32_t eyear) const;
5386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
5406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * return the length of the given month.
5416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param month    the given month.
5426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @return    the length of the given month.
5436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @internal
5446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
5456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    virtual int32_t monthLength(int32_t month) const;
5466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
5486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * return the length of the month according to the given year.
5496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param month    the given month.
5506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param year     the given year.
5516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @return         the length of the month
5526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @internal
5536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
5546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    virtual int32_t monthLength(int32_t month, int32_t year) const;
5556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#ifndef U_HIDE_INTERNAL_API
5576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
5586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * return the length of the given year.
5596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param year    the given year.
5606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @return        the length of the given year.
5616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @internal
5626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
5636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t yearLength(int32_t year) const;
5646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
5666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * return the length of the year field.
5676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @return    the length of the year field
5686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @internal
5696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
5706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t yearLength(void) const;
5716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
5736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * After adjustments such as add(MONTH), add(YEAR), we don't want the
5746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * month to jump around.  E.g., we don't want Jan 31 + 1 month to go to Mar
5756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * 3, we want it to go to Feb 28.  Adjustments which might run into this
5766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * problem call this method to retain the proper month.
5776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @internal
5786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
5796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    void pinDayOfMonth(void);
5806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif  /* U_HIDE_INTERNAL_API */
5816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
5836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Return the day number with respect to the epoch.  January 1, 1970 (Gregorian)
5846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * is day zero.
5856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param status Fill-in parameter which receives the status of this operation.
5866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @return       the day number with respect to the epoch.
5876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @internal
5886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
5896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    virtual UDate getEpochDay(UErrorCode& status);
5906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
5926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Subclass API for defining limits of different types.
5936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Subclasses must implement this method to return limits for the
5946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * following fields:
5956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *
5966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * <pre>UCAL_ERA
5976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * UCAL_YEAR
5986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * UCAL_MONTH
5996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * UCAL_WEEK_OF_YEAR
6006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * UCAL_WEEK_OF_MONTH
6016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * UCAL_DATE (DAY_OF_MONTH on Java)
6026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * UCAL_DAY_OF_YEAR
6036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * UCAL_DAY_OF_WEEK_IN_MONTH
6046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * UCAL_YEAR_WOY
6056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * UCAL_EXTENDED_YEAR</pre>
6066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *
6076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param field one of the above field numbers
6086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param limitType one of <code>MINIMUM</code>, <code>GREATEST_MINIMUM</code>,
6096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * <code>LEAST_MAXIMUM</code>, or <code>MAXIMUM</code>
6106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @internal
6116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
6126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    virtual int32_t handleGetLimit(UCalendarDateFields field, ELimitType limitType) const;
6136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
6156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Return the extended year defined by the current fields.  This will
6166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * use the UCAL_EXTENDED_YEAR field or the UCAL_YEAR and supra-year fields (such
6176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * as UCAL_ERA) specific to the calendar system, depending on which set of
6186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * fields is newer.
6196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @return the extended year
6206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @internal
6216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
6226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    virtual int32_t handleGetExtendedYear();
6236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
6256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Subclasses may override this to convert from week fields
6266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * (YEAR_WOY and WEEK_OF_YEAR) to an extended year in the case
6276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * where YEAR, EXTENDED_YEAR are not set.
6286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * The Gregorian implementation assumes a yearWoy in gregorian format, according to the current era.
6296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @return the extended year, UCAL_EXTENDED_YEAR
6306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @internal
6316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
6326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    virtual int32_t handleGetExtendedYearFromWeekFields(int32_t yearWoy, int32_t woy);
6336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
6366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Subclasses may override this method to compute several fields
6376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * specific to each calendar system.  These are:
6386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *
6396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * <ul><li>ERA
6406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * <li>YEAR
6416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * <li>MONTH
6426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * <li>DAY_OF_MONTH
6436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * <li>DAY_OF_YEAR
6446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * <li>EXTENDED_YEAR</ul>
6456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *
6466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * <p>The GregorianCalendar implementation implements
6476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * a calendar with the specified Julian/Gregorian cutover date.
6486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @internal
6496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
6506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    virtual void handleComputeFields(int32_t julianDay, UErrorCode &status);
6516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org private:
6536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
6546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Compute the julian day number of the given year.
6556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param isGregorian    if true, using Gregorian calendar, otherwise using Julian calendar
6566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param year           the given year.
6576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param isLeap         true if the year is a leap year.
6586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @return
6596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
6606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static double computeJulianDayOfYear(UBool isGregorian, int32_t year,
6616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                         UBool& isLeap);
6626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
6646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Validates the values of the set time fields.  True if they're all valid.
6656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @return    True if the set time fields are all valid.
6666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
6676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UBool validateFields(void) const;
6686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
6706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Validates the value of the given time field.  True if it's valid.
6716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
6726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UBool boundsCheck(int32_t value, UCalendarDateFields field) const;
6736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
6756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Return the pseudo-time-stamp for two fields, given their
6766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * individual pseudo-time-stamps.  If either of the fields
6776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * is unset, then the aggregate is unset.  Otherwise, the
6786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * aggregate is the later of the two stamps.
6796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param stamp_a    One given field.
6806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param stamp_b    Another given field.
6816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @return the pseudo-time-stamp for two fields
6826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
6836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t aggregateStamp(int32_t stamp_a, int32_t stamp_b);
6846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
6866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * The point at which the Gregorian calendar rules are used, measured in
6876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * milliseconds from the standard epoch.  Default is October 15, 1582
6886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * (Gregorian) 00:00:00 UTC, that is, October 4, 1582 (Julian) is followed
6896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * by October 15, 1582 (Gregorian).  This corresponds to Julian day number
6906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * 2299161. This is measured from the standard epoch, not in Julian Days.
6916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
6926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UDate                fGregorianCutover;
6936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
6956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Julian day number of the Gregorian cutover
6966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
6976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t             fCutoverJulianDay;
6986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
7006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Midnight, local time (using this Calendar's TimeZone) at or before the
7016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * gregorianCutover. This is a pure date value with no time of day or
7026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * timezone component.
7036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
7046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UDate                 fNormalizedGregorianCutover;// = gregorianCutover;
7056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
7076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * The year of the gregorianCutover, with 0 representing
7086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * 1 BC, -1 representing 2 BC, etc.
7096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
7106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t fGregorianCutoverYear;// = 1582;
7116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
7136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * The year of the gregorianCutover, with 0 representing
7146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * 1 BC, -1 representing 2 BC, etc.
7156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
7166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t fGregorianCutoverJulianDay;// = 2299161;
7176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
7196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Converts time as milliseconds to Julian date. The Julian date used here is not a
7206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * true Julian date, since it is measured from midnight, not noon.
7216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *
7226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param millis  The given milliseconds.
7236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @return        The Julian date number.
7246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
7256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static double millisToJulianDay(UDate millis);
7266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
7286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Converts Julian date to time as milliseconds. The Julian date used here is not a
7296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * true Julian date, since it is measured from midnight, not noon.
7306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *
7316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param julian  The given Julian date number.
7326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @return        Time as milliseconds.
7336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
7346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static UDate julianDayToMillis(double julian);
7356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
7376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Used by handleComputeJulianDay() and handleComputeMonthStart().
7386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Temporary field indicating whether the calendar is currently Gregorian as opposed to Julian.
7396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
7406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UBool fIsGregorian;
7416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
7436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Used by handleComputeJulianDay() and handleComputeMonthStart().
7446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Temporary field indicating that the sense of the gregorian cutover should be inverted
7456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * to handle certain calculations on and around the cutover date.
7466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
7476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UBool fInvertGregorian;
7486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org public: // internal implementation
7516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
7536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @return TRUE if this calendar has the notion of a default century
7546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @internal
7556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
7566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    virtual UBool haveDefaultCentury() const;
7576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
7596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @return the start of the default century
7606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @internal
7616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
7626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    virtual UDate defaultCenturyStart() const;
7636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
7656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @return the beginning year of the default century
7666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @internal
7676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
7686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    virtual int32_t defaultCenturyStartYear() const;
7696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org};
7706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_NAMESPACE_END
7726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif /* #if !UCONFIG_NO_FORMATTING */
7746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif // _GREGOCAL
7766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org//eof
7776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
778