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