12d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert// © 2016 and later: Unicode, Inc. and others.
22d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert// License & terms of use: http://www.unicode.org/copyright.html#License
3bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert/*
487255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert*   Copyright (C) 1996-2016, International Business Machines
5bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert*   Corporation and others.  All Rights Reserved.
6bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert*/
7bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
8bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubertpackage com.ibm.icu.util;
9bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
10bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubertimport java.io.Serializable;
11bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubertimport java.util.Date;
12bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubertimport java.util.GregorianCalendar;
13bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubertimport java.util.Locale;
14bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
15bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubertimport com.ibm.icu.text.DateFormat;
16bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubertimport com.ibm.icu.util.ULocale.Category;
17bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
18bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert/**
19bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * {@icuenhanced java.util.Calendar}.{@icu _usage_}
20bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *
21bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * <p><code>Calendar</code> is an abstract base class for converting between
22bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * a <code>Date</code> object and a set of integer fields such as
23bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * <code>YEAR</code>, <code>MONTH</code>, <code>DAY</code>, <code>HOUR</code>,
24bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * and so on. (A <code>Date</code> object represents a specific instant in
25bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * time with millisecond precision. See
26bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * {@link Date}
27bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * for information about the <code>Date</code> class.)
28bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *
29bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * <p>Subclasses of <code>Calendar</code> interpret a <code>Date</code>
30bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * according to the rules of a specific calendar system.  ICU4J contains
31bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * several subclasses implementing different international calendar systems.
32bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *
33bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * <p>
34bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * Like other locale-sensitive classes, <code>Calendar</code> provides a
35bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * class method, <code>getInstance</code>, for getting a generally useful
36bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * object of this type. <code>Calendar</code>'s <code>getInstance</code> method
37bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * returns a calendar of a type appropriate to the locale, whose
38bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * time fields have been initialized with the current date and time:
39bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * <blockquote>
40bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * <pre>Calendar rightNow = Calendar.getInstance()</pre>
41bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * </blockquote>
42bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *
43bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * <p>When a <code>ULocale</code> is used by <code>getInstance</code>, its
44bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * '<code>calendar</code>' tag and value are retrieved if present.  If a recognized
45bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * value is supplied, a calendar is provided and configured as appropriate.
46bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * Currently recognized tags are "buddhist", "chinese", "coptic", "ethiopic",
47bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * "gregorian", "hebrew", "islamic", "islamic-civil", "japanese", and "roc".  For
48bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * example: <blockquote>
49bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * <pre>Calendar cal = Calendar.getInstance(new ULocale("en_US@calendar=japanese"));</pre>
50bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * </blockquote> will return an instance of JapaneseCalendar (using en_US conventions for
51bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * minimum days in first week, start day of week, et cetera).
52bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *
53bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * <p>A <code>Calendar</code> object can produce all the time field values
54bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * needed to implement the date-time formatting for a particular language and
55bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * calendar style (for example, Japanese-Gregorian, Japanese-Traditional).
56bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * <code>Calendar</code> defines the range of values returned by certain fields,
57bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * as well as their meaning.  For example, the first month of the year has value
58bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * <code>MONTH</code> == <code>JANUARY</code> for all calendars.  Other values
59bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * are defined by the concrete subclass, such as <code>ERA</code> and
60bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * <code>YEAR</code>.  See individual field documentation and subclass
61bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * documentation for details.
62bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *
63bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * <p>When a <code>Calendar</code> is <em>lenient</em>, it accepts a wider range
64bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * of field values than it produces.  For example, a lenient
65bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * <code>GregorianCalendar</code> interprets <code>MONTH</code> ==
66bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * <code>JANUARY</code>, <code>DAY_OF_MONTH</code> == 32 as February 1.  A
67bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * non-lenient <code>GregorianCalendar</code> throws an exception when given
68bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * out-of-range field settings.  When calendars recompute field values for
69bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * return by <code>get()</code>, they normalize them.  For example, a
70bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * <code>GregorianCalendar</code> always produces <code>DAY_OF_MONTH</code>
71bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * values between 1 and the length of the month.
72bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *
73bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * <p><code>Calendar</code> defines a locale-specific seven day week using two
74bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * parameters: the first day of the week and the minimal days in first week
75bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * (from 1 to 7).  These numbers are taken from the locale resource data when a
76bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * <code>Calendar</code> is constructed.  They may also be specified explicitly
77bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * through the API.
78bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *
79bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * <p>When setting or getting the <code>WEEK_OF_MONTH</code> or
80bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * <code>WEEK_OF_YEAR</code> fields, <code>Calendar</code> must determine the
81bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * first week of the month or year as a reference point.  The first week of a
82bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * month or year is defined as the earliest seven day period beginning on
83bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * <code>getFirstDayOfWeek()</code> and containing at least
84bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * <code>getMinimalDaysInFirstWeek()</code> days of that month or year.  Weeks
85bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * numbered ..., -1, 0 precede the first week; weeks numbered 2, 3,... follow
86bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * it.  Note that the normalized numbering returned by <code>get()</code> may be
87bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * different.  For example, a specific <code>Calendar</code> subclass may
88bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * designate the week before week 1 of a year as week <em>n</em> of the previous
89bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * year.
90bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *
91bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * <p> When computing a <code>Date</code> from time fields, two special
92bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * circumstances may arise: there may be insufficient information to compute the
93bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * <code>Date</code> (such as only year and month but no day in the month), or
94bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * there may be inconsistent information (such as "Tuesday, July 15, 1996" --
95bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * July 15, 1996 is actually a Monday).
96bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *
97bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * <p><strong>Insufficient information.</strong> The calendar will use default
98bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * information to specify the missing fields. This may vary by calendar; for
99bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * the Gregorian calendar, the default for a field is the same as that of the
100bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * start of the epoch: i.e., YEAR = 1970, MONTH = JANUARY, DATE = 1, etc.
101bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *
102bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * <p><strong>Inconsistent information.</strong> If fields conflict, the calendar
103bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * will give preference to fields set more recently. For example, when
104bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * determining the day, the calendar will look for one of the following
105bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * combinations of fields.  The most recent combination, as determined by the
106bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * most recently set single field, will be used.
107bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *
108bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * <blockquote>
109bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * <pre>
110bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * MONTH + DAY_OF_MONTH
111bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * MONTH + WEEK_OF_MONTH + DAY_OF_WEEK
112bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * MONTH + DAY_OF_WEEK_IN_MONTH + DAY_OF_WEEK
113bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * DAY_OF_YEAR
114bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * DAY_OF_WEEK + WEEK_OF_YEAR</pre>
115bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * </blockquote>
116bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *
117bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * For the time of day:
118bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *
119bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * <blockquote>
120bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * <pre>
121bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * HOUR_OF_DAY
122bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * AM_PM + HOUR</pre>
123bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * </blockquote>
124bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *
125bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * <p><strong>Note:</strong> for some non-Gregorian calendars, different
126bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * fields may be necessary for complete disambiguation. For example, a full
127bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * specification of the historial Arabic astronomical calendar requires year,
128bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * month, day-of-month <em>and</em> day-of-week in some cases.
129bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *
130bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * <p><strong>Note:</strong> There are certain possible ambiguities in
131bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * interpretation of certain singular times, which are resolved in the
132bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * following ways:
133bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * <ol>
134bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     <li> 24:00:00 "belongs" to the following day. That is,
135bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *          23:59 on Dec 31, 1969 &lt; 24:00 on Jan 1, 1970 &lt; 24:01:00 on Jan 1, 1970
136bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *
137bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     <li> Although historically not precise, midnight also belongs to "am",
138bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *          and noon belongs to "pm", so on the same day,
139bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *          12:00 am (midnight) &lt; 12:01 am, and 12:00 pm (noon) &lt; 12:01 pm
140bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * </ol>
141bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *
142bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * <p>The date or time format strings are not part of the definition of a
143bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * calendar, as those must be modifiable or overridable by the user at
144bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * runtime. Use {@link DateFormat}
145bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * to format dates.
146bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *
147bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * <p><strong>Field manipulation methods</strong></p>
148bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *
149bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * <p><code>Calendar</code> fields can be changed using three methods:
150bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * <code>set()</code>, <code>add()</code>, and <code>roll()</code>.</p>
151bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *
152bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * <p><strong><code>set(f, value)</code></strong> changes field
153bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * <code>f</code> to <code>value</code>.  In addition, it sets an
154bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * internal member variable to indicate that field <code>f</code> has
155bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * been changed. Although field <code>f</code> is changed immediately,
156bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * the calendar's milliseconds is not recomputed until the next call to
157bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * <code>get()</code>, <code>getTime()</code>, or
158bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * <code>getTimeInMillis()</code> is made. Thus, multiple calls to
159bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * <code>set()</code> do not trigger multiple, unnecessary
160bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * computations. As a result of changing a field using
161bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * <code>set()</code>, other fields may also change, depending on the
162bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * field, the field value, and the calendar system. In addition,
163bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * <code>get(f)</code> will not necessarily return <code>value</code>
164bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * after the fields have been recomputed. The specifics are determined by
165bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * the concrete calendar class.</p>
166bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *
167bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * <p><em>Example</em>: Consider a <code>GregorianCalendar</code>
168bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * originally set to August 31, 1999. Calling <code>set(Calendar.MONTH,
169bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * Calendar.SEPTEMBER)</code> sets the calendar to September 31,
170bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * 1999. This is a temporary internal representation that resolves to
171bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * October 1, 1999 if <code>getTime()</code>is then called. However, a
172bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * call to <code>set(Calendar.DAY_OF_MONTH, 30)</code> before the call to
173bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * <code>getTime()</code> sets the calendar to September 30, 1999, since
174bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * no recomputation occurs after <code>set()</code> itself.</p>
175bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *
176bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * <p><strong><code>add(f, delta)</code></strong> adds <code>delta</code>
177bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * to field <code>f</code>.  This is equivalent to calling <code>set(f,
178bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * get(f) + delta)</code> with two adjustments:</p>
179bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *
180bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * <blockquote>
181bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *   <p><strong>Add rule 1</strong>. The value of field <code>f</code>
182bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *   after the call minus the value of field <code>f</code> before the
183bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *   call is <code>delta</code>, modulo any overflow that has occurred in
184bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *   field <code>f</code>. Overflow occurs when a field value exceeds its
185bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *   range and, as a result, the next larger field is incremented or
186bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *   decremented and the field value is adjusted back into its range.</p>
187bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *
188bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *   <p><strong>Add rule 2</strong>. If a smaller field is expected to be
189bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *   invariant, but &nbsp; it is impossible for it to be equal to its
190bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *   prior value because of changes in its minimum or maximum after field
191bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *   <code>f</code> is changed, then its value is adjusted to be as close
192bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *   as possible to its expected value. A smaller field represents a
193bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *   smaller unit of time. <code>HOUR</code> is a smaller field than
194bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *   <code>DAY_OF_MONTH</code>. No adjustment is made to smaller fields
195bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *   that are not expected to be invariant. The calendar system
196bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *   determines what fields are expected to be invariant.</p>
197bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * </blockquote>
198bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *
199bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * <p>In addition, unlike <code>set()</code>, <code>add()</code> forces
200bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * an immediate recomputation of the calendar's milliseconds and all
201bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * fields.</p>
202bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *
203bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * <p><em>Example</em>: Consider a <code>GregorianCalendar</code>
204bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * originally set to August 31, 1999. Calling <code>add(Calendar.MONTH,
205bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * 13)</code> sets the calendar to September 30, 2000. <strong>Add rule
206bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * 1</strong> sets the <code>MONTH</code> field to September, since
207bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * adding 13 months to August gives September of the next year. Since
208bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * <code>DAY_OF_MONTH</code> cannot be 31 in September in a
209bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * <code>GregorianCalendar</code>, <strong>add rule 2</strong> sets the
210bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * <code>DAY_OF_MONTH</code> to 30, the closest possible value. Although
211bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * it is a smaller field, <code>DAY_OF_WEEK</code> is not adjusted by
212bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * rule 2, since it is expected to change when the month changes in a
213bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * <code>GregorianCalendar</code>.</p>
214bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *
215bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * <p><strong><code>roll(f, delta)</code></strong> adds
216bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * <code>delta</code> to field <code>f</code> without changing larger
217bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * fields. This is equivalent to calling <code>add(f, delta)</code> with
218bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * the following adjustment:</p>
219bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *
220bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * <blockquote>
221bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *   <p><strong>Roll rule</strong>. Larger fields are unchanged after the
222bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *   call. A larger field represents a larger unit of
223bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *   time. <code>DAY_OF_MONTH</code> is a larger field than
224bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *   <code>HOUR</code>.</p>
225bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * </blockquote>
226bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *
227bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * <p><em>Example</em>: Consider a <code>GregorianCalendar</code>
228bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * originally set to August 31, 1999. Calling <code>roll(Calendar.MONTH,
229bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * 8)</code> sets the calendar to April 30, <strong>1999</strong>.  Add
230bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * rule 1 sets the <code>MONTH</code> field to April. Using a
231bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * <code>GregorianCalendar</code>, the <code>DAY_OF_MONTH</code> cannot
232bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * be 31 in the month April. Add rule 2 sets it to the closest possible
233bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * value, 30. Finally, the <strong>roll rule</strong> maintains the
234bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * <code>YEAR</code> field value of 1999.</p>
235bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *
236bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * <p><em>Example</em>: Consider a <code>GregorianCalendar</code>
237bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * originally set to Sunday June 6, 1999. Calling
238bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * <code>roll(Calendar.WEEK_OF_MONTH, -1)</code> sets the calendar to
239bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * Tuesday June 1, 1999, whereas calling
240bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * <code>add(Calendar.WEEK_OF_MONTH, -1)</code> sets the calendar to
241bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * Sunday May 30, 1999. This is because the roll rule imposes an
242bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * additional constraint: The <code>MONTH</code> must not change when the
243bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * <code>WEEK_OF_MONTH</code> is rolled. Taken together with add rule 1,
244bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * the resultant date must be between Tuesday June 1 and Saturday June
245bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * 5. According to add rule 2, the <code>DAY_OF_WEEK</code>, an invariant
246bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * when changing the <code>WEEK_OF_MONTH</code>, is set to Tuesday, the
247bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * closest possible value to Sunday (where Sunday is the first day of the
248bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * week).</p>
249bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *
250bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * <p><strong>Usage model</strong>. To motivate the behavior of
251bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * <code>add()</code> and <code>roll()</code>, consider a user interface
252bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * component with increment and decrement buttons for the month, day, and
253bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * year, and an underlying <code>GregorianCalendar</code>. If the
254bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * interface reads January 31, 1999 and the user presses the month
255bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * increment button, what should it read? If the underlying
256bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * implementation uses <code>set()</code>, it might read March 3, 1999. A
257bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * better result would be February 28, 1999. Furthermore, if the user
258bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * presses the month increment button again, it should read March 31,
259bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * 1999, not March 28, 1999. By saving the original date and using either
260bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * <code>add()</code> or <code>roll()</code>, depending on whether larger
261bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * fields should be affected, the user interface can behave as most users
262bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * will intuitively expect.</p>
263bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *
264bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * <p><b>Note:</b> You should always use {@link #roll roll} and {@link #add add} rather
265bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * than attempting to perform arithmetic operations directly on the fields
266bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * of a <tt>Calendar</tt>.  It is quite possible for <tt>Calendar</tt> subclasses
267bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * to have fields with non-linear behavior, for example missing months
268bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * or days during non-leap years.  The subclasses' <tt>add</tt> and <tt>roll</tt>
269bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * methods will take this into account, while simple arithmetic manipulations
270bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * may give invalid results.
271bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *
272bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * <p><big><big><b>Calendar Architecture in ICU4J</b></big></big></p>
273bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *
274bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * <p>Recently the implementation of <code>Calendar</code> has changed
275bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * significantly in order to better support subclassing. The original
276bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * <code>Calendar</code> class was designed to support subclassing, but
277bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * it had only one implemented subclass, <code>GregorianCalendar</code>.
278bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * With the implementation of several new calendar subclasses, including
279bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * the <code>BuddhistCalendar</code>, <code>ChineseCalendar</code>,
280bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * <code>HebrewCalendar</code>, <code>IslamicCalendar</code>, and
281bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * <code>JapaneseCalendar</code>, the subclassing API has been reworked
282bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * thoroughly. This section details the new subclassing API and other
283bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * ways in which <code>com.ibm.icu.util.Calendar</code> differs from
284bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * <code>java.util.Calendar</code>.
285bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * </p>
286bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *
287bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * <p><big><b>Changes</b></big></p>
288bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *
289bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * <p>Overview of changes between the classic <code>Calendar</code>
290bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * architecture and the new architecture.
291bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *
292bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * <ul>
293bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *
294bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *   <li>The <code>fields[]</code> array is <code>private</code> now
295bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     instead of <code>protected</code>.  Subclasses must access it
296bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     using the methods {@link #internalSet} and
297bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     {@link #internalGet}.  <b>Motivation:</b> Subclasses should
298bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     not directly access data members.</li>
299bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *
300bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *   <li>The <code>time</code> long word is <code>private</code> now
301bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     instead of <code>protected</code>.  Subclasses may access it using
302bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     the method {@link #internalGetTimeInMillis}, which does not
303bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     provoke an update. <b>Motivation:</b> Subclasses should not
304bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     directly access data members.</li>
305bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *
306bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *   <li>The scope of responsibility of subclasses has been drastically
307bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     reduced. As much functionality as possible is implemented in the
308bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     <code>Calendar</code> base class. As a result, it is much easier
309bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     to subclass <code>Calendar</code>. <b>Motivation:</b> Subclasses
310bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     should not have to reimplement common code. Certain behaviors are
311bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     common across calendar systems: The definition and behavior of
312bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     week-related fields and time fields, the arithmetic
313bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     ({@link #add(int, int) add} and {@link #roll(int, int) roll}) behavior of many
314bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     fields, and the field validation system.</li>
315bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *
316bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *   <li>The subclassing API has been completely redesigned.</li>
317bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *
318bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *   <li>The <code>Calendar</code> base class contains some Gregorian
319bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     calendar algorithmic support that subclasses can use (specifically
320bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     in {@link #handleComputeFields}).  Subclasses can use the
321bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     methods <code>getGregorianXxx()</code> to obtain precomputed
322bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     values. <b>Motivation:</b> This is required by all
323bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     <code>Calendar</code> subclasses in order to implement consistent
324bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     time zone behavior, and Gregorian-derived systems can use the
325bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     already computed data.</li>
326bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *
327bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *   <li>The <code>FIELD_COUNT</code> constant has been removed. Use
328bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     {@link #getFieldCount}.  In addition, framework API has been
329bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     added to allow subclasses to define additional fields.
330bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     <b>Motivation: </b>The number of fields is not constant across
331bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     calendar systems.</li>
332bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *
333bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *   <li>The range of handled dates has been narrowed from +/-
334bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     ~300,000,000 years to +/- ~5,000,000 years. In practical terms
335bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     this should not affect clients. However, it does mean that client
336bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     code cannot be guaranteed well-behaved results with dates such as
337bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     <code>Date(Long.MIN_VALUE)</code> or
338bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     <code>Date(Long.MAX_VALUE)</code>. Instead, the
339bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     <code>Calendar</code> protected constants should be used.
340bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     <b>Motivation:</b> With
341bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     the addition of the {@link #JULIAN_DAY} field, Julian day
342bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     numbers must be restricted to a 32-bit <code>int</code>.  This
343bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     restricts the overall supported range. Furthermore, restricting
344bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     the supported range simplifies the computations by removing
345bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     special case code that was used to accomodate arithmetic overflow
346bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     at millis near <code>Long.MIN_VALUE</code> and
347bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     <code>Long.MAX_VALUE</code>.</li>
348bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *
349bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *   <li>New fields are implemented: {@link #JULIAN_DAY} defines
350bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     single-field specification of the
351bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     date. {@link #MILLISECONDS_IN_DAY} defines a single-field
352bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     specification of the wall time. {@link #DOW_LOCAL} and
353bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     {@link #YEAR_WOY} implement localized day-of-week and
354bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     week-of-year behavior.</li>
355bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *
356bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *   <li>Subclasses can access protected millisecond constants
357bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *   defined in <code>Calendar</code>.</li>
358bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *
359bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *   <li>New API has been added to support calendar-specific subclasses
360bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     of <code>DateFormat</code>.</li>
361bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *
362bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *   <li>Several subclasses have been implemented, representing
363bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     various international calendar systems.</li>
364bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *
365bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * </ul>
366bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *
367bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * <p><big><b>Subclass API</b></big></p>
368bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *
369bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * <p>The original <code>Calendar</code> API was based on the experience
370bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * of implementing a only a single subclass,
371bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * <code>GregorianCalendar</code>. As a result, all of the subclassing
372bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * kinks had not been worked out. The new subclassing API has been
373bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * refined based on several implemented subclasses. This includes methods
374bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * that must be overridden and methods for subclasses to call. Subclasses
375bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * no longer have direct access to <code>fields</code> and
376bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * <code>stamp</code>. Instead, they have new API to access
377bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * these. Subclasses are able to allocate the <code>fields</code> array
378bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * through a protected framework method; this allows subclasses to
379bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * specify additional fields. </p>
380bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *
381bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * <p>More functionality has been moved into the base class. The base
382bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * class now contains much of the computational machinery to support the
383bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * Gregorian calendar. This is based on two things: (1) Many calendars
384bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * are based on the Gregorian calendar (such as the Buddhist and Japanese
385bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * imperial calendars). (2) <em>All</em> calendars require basic
386bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * Gregorian support in order to handle timezone computations. </p>
387bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *
388bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * <p>Common computations have been moved into
389bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * <code>Calendar</code>. Subclasses no longer compute the week related
390bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * fields and the time related fields. These are commonly handled for all
391bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * calendars by the base class. </p>
392bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *
393bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * <p><b>Subclass computation of time <tt>=&gt;</tt> fields</b>
394bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *
395bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * <p>The {@link #ERA}, {@link #YEAR},
396bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * {@link #EXTENDED_YEAR}, {@link #MONTH},
397bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * {@link #DAY_OF_MONTH}, and {@link #DAY_OF_YEAR} fields are
398bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * computed by the subclass, based on the Julian day. All other fields
399bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * are computed by <code>Calendar</code>.
400bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *
401bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * <ul>
402bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *
403bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *   <li>Subclasses should implement {@link #handleComputeFields}
404bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     to compute the {@link #ERA}, {@link #YEAR},
405bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     {@link #EXTENDED_YEAR}, {@link #MONTH},
406bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     {@link #DAY_OF_MONTH}, and {@link #DAY_OF_YEAR} fields,
407bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     based on the value of the {@link #JULIAN_DAY} field. If there
408bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     are calendar-specific fields not defined by <code>Calendar</code>,
409bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     they must also be computed. These are the only fields that the
410bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     subclass should compute. All other fields are computed by the base
411bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     class, so time and week fields behave in a consistent way across
412bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     all calendars. The default version of this method in
413bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     <code>Calendar</code> implements a proleptic Gregorian
414bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     calendar. Within this method, subclasses may call
415bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     <code>getGregorianXxx()</code> to obtain the Gregorian calendar
416bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     month, day of month, and extended year for the given date.</li>
417bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *
418bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * </ul>
419bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *
420bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * <p><b>Subclass computation of fields <tt>=&gt;</tt> time</b>
421bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *
422bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * <p>The interpretation of most field values is handled entirely by
423bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * <code>Calendar</code>. <code>Calendar</code> determines which fields
424bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * are set, which are not, which are set more recently, and so on. In
425bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * addition, <code>Calendar</code> handles the computation of the time
426bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * from the time fields and handles the week-related fields. The only
427bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * thing the subclass must do is determine the extended year, based on
428bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * the year fields, and then, given an extended year and a month, it must
429bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * return a Julian day number.
430bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *
431bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * <ul>
432bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *
433bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *   <li>Subclasses should implement {@link #handleGetExtendedYear}
434bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     to return the extended year for this calendar system, based on the
435bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     {@link #YEAR}, {@link #EXTENDED_YEAR}, and any fields that
436bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     the calendar system uses that are larger than a year, such as
437bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     {@link #ERA}.</li>
438bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *
439bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *   <li>Subclasses should implement {@link #handleComputeMonthStart}
440bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     to return the Julian day number
441bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     associated with a month and extended year. This is the Julian day
442bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     number of the day before the first day of the month. The month
443bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     number is zero-based. This computation should not depend on any
444bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     field values.</li>
445bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *
446bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * </ul>
447bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *
448bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * <p><b>Other methods</b>
449bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *
450bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * <ul>
451bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *
452bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *   <li>Subclasses should implement {@link #handleGetMonthLength}
453bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     to return the number of days in a
454bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     given month of a given extended year. The month number, as always,
455bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     is zero-based.</li>
456bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *
457bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *   <li>Subclasses should implement {@link #handleGetYearLength}
458bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     to return the number of days in the given
459bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     extended year. This method is used by
460bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     <tt>computeWeekFields</tt> to compute the
461bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     {@link #WEEK_OF_YEAR} and {@link #YEAR_WOY} fields.</li>
462bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *
463bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *   <li>Subclasses should implement {@link #handleGetLimit}
464bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     to return the protected values of a field, depending on the value of
465bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     <code>limitType</code>. This method only needs to handle the
466bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     fields {@link #ERA}, {@link #YEAR}, {@link #MONTH},
467bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     {@link #WEEK_OF_YEAR}, {@link #WEEK_OF_MONTH},
468bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     {@link #DAY_OF_MONTH}, {@link #DAY_OF_YEAR},
469bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     {@link #DAY_OF_WEEK_IN_MONTH}, {@link #YEAR_WOY}, and
470bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     {@link #EXTENDED_YEAR}.  Other fields are invariant (with
471bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     respect to calendar system) and are handled by the base
472bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     class.</li>
473bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *
474bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *   <li>Optionally, subclasses may override {@link #validateField}
475bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     to check any subclass-specific fields. If the
476bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     field's value is out of range, the method should throw an
477bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     <code>IllegalArgumentException</code>. The method may call
478bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     <code>super.validateField(field)</code> to handle fields in a
479bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     generic way, that is, to compare them to the range
480bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     <code>getMinimum(field)</code>..<code>getMaximum(field)</code>.</li>
481bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *
482bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *   <li>Optionally, subclasses may override
483bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     {@link #handleCreateFields} to create an <code>int[]</code>
484bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     array large enough to hold the calendar's fields. This is only
485bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     necessary if the calendar defines additional fields beyond those
486bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     defined by <code>Calendar</code>. The length of the result must be
487bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     be between the base and maximum field counts.</li>
488bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *
489bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *   <li>Optionally, subclasses may override
490bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     {@link #handleGetDateFormat} to create a
491bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     <code>DateFormat</code> appropriate to this calendar. This is only
492bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     required if a calendar subclass redefines the use of a field (for
493bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     example, changes the {@link #ERA} field from a symbolic field
494bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     to a numeric one) or defines an additional field.</li>
495bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *
496bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *   <li>Optionally, subclasses may override {@link #roll roll} and
497bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     {@link #add add} to handle fields that are discontinuous. For
498bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     example, in the Hebrew calendar the month &quot;Adar I&quot; only
499bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     occurs in leap years; in other years the calendar jumps from
500bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     Shevat (month #4) to Adar (month #6). The {@link
501bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     HebrewCalendar#add HebrewCalendar.add} and {@link
502bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     HebrewCalendar#roll HebrewCalendar.roll} methods take this into
503bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     account, so that adding 1 month to Shevat gives the proper result
504bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     (Adar) in a non-leap year. The protected utility method {@link
505bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     #pinField pinField} is often useful when implementing these two
506bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     methods. </li>
507bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *
508bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * </ul>
509bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *
510bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * <p><big><b>Normalized behavior</b></big>
511bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *
512bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * <p>The behavior of certain fields has been made consistent across all
513bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * calendar systems and implemented in <code>Calendar</code>.
514bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *
515bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * <ul>
516bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *
517bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *   <li>Time is normalized. Even though some calendar systems transition
518bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     between days at sunset or at other times, all ICU4J calendars
519bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     transition between days at <em>local zone midnight</em>.  This
520bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     allows ICU4J to centralize the time computations in
521bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     <code>Calendar</code> and to maintain basic correpsondences
522bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     between calendar systems. Affected fields: {@link #AM_PM},
523bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     {@link #HOUR}, {@link #HOUR_OF_DAY}, {@link #MINUTE},
524bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     {@link #SECOND}, {@link #MILLISECOND},
525bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     {@link #ZONE_OFFSET}, and {@link #DST_OFFSET}.</li>
526bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *
527bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *   <li>DST behavior is normalized. Daylight savings time behavior is
528bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     computed the same for all calendar systems, and depends on the
529bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     value of several <code>GregorianCalendar</code> fields: the
530bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     {@link #YEAR}, {@link #MONTH}, and
531bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     {@link #DAY_OF_MONTH}. As a result, <code>Calendar</code>
532bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     always computes these fields, even for non-Gregorian calendar
533bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     systems. These fields are available to subclasses.</li>
534bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *
535bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *   <li>Weeks are normalized. Although locales define the week
536bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     differently, in terms of the day on which it starts, and the
537bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     designation of week number one of a month or year, they all use a
538bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     common mechanism. Furthermore, the day of the week has a simple
539bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     and consistent definition throughout history. For example,
540bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     although the Gregorian calendar introduced a discontinuity when
541bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     first instituted, the day of week was not disrupted. For this
542bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     reason, the fields {@link #DAY_OF_WEEK}, <code>WEEK_OF_YEAR,
543bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     WEEK_OF_MONTH</code>, {@link #DAY_OF_WEEK_IN_MONTH},
544bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     {@link #DOW_LOCAL}, {@link #YEAR_WOY} are all computed in
545bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     a consistent way in the base class, based on the
546bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     {@link #EXTENDED_YEAR}, {@link #DAY_OF_YEAR},
547bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     {@link #MONTH}, and {@link #DAY_OF_MONTH}, which are
548bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     computed by the subclass.</li>
549bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *
550bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * </ul>
551bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *
552bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * <p><big><b>Supported range</b></big>
553bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *
554bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * <p>The allowable range of <code>Calendar</code> has been
555bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * narrowed. <code>GregorianCalendar</code> used to attempt to support
556bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * the range of dates with millisecond values from
557bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * <code>Long.MIN_VALUE</code> to <code>Long.MAX_VALUE</code>. This
558bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * introduced awkward constructions (hacks) which slowed down
559bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * performance. It also introduced non-uniform behavior at the
560bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * boundaries. The new <code>Calendar</code> protocol specifies the
561bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * maximum range of supportable dates as those having Julian day numbers
562bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * of <code>-0x7F000000</code> to <code>+0x7F000000</code>. This
563bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * corresponds to years from ~5,000,000 BCE to ~5,000,000 CE. Programmers
564bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * should use the protected constants in <code>Calendar</code> to
565bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * specify an extremely early or extremely late date.</p>
566bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *
567bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * <p><big><b>General notes</b></big>
568bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *
569bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * <ul>
570bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *
571bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *   <li>Calendars implementations are <em>proleptic</em>. For example,
572bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     even though the Gregorian calendar was not instituted until the
573bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     16th century, the <code>GregorianCalendar</code> class supports
574bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     dates before the historical onset of the calendar by extending the
575bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     calendar system backward in time. Similarly, the
576bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     <code>HebrewCalendar</code> extends backward before the start of
577bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     its epoch into zero and negative years. Subclasses do not throw
578bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     exceptions because a date precedes the historical start of a
579bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     calendar system. Instead, they implement
580bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     {@link #handleGetLimit} to return appropriate limits on
581bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     {@link #YEAR}, {@link #ERA}, etc. fields. Then, if the
582bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     calendar is set to not be lenient, out-of-range field values will
583bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     trigger an exception.</li>
584bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *
585bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *   <li>Calendar system subclasses compute a <em>extended
586bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     year</em>. This differs from the {@link #YEAR} field in that
587bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     it ranges over all integer values, including zero and negative
588bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     values, and it encapsulates the information of the
589bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     {@link #YEAR} field and all larger fields.  Thus, for the
590bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     Gregorian calendar, the {@link #EXTENDED_YEAR} is computed as
591bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     <code>ERA==AD ? YEAR : 1-YEAR</code>. Another example is the Mayan
592bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     long count, which has years (<code>KUN</code>) and nested cycles
593bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     of years (<code>KATUN</code> and <code>BAKTUN</code>). The Mayan
594bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     {@link #EXTENDED_YEAR} is computed as <code>TUN + 20 * (KATUN
595bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     + 20 * BAKTUN)</code>. The <code>Calendar</code> base class uses
596bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     the {@link #EXTENDED_YEAR} field to compute the week-related
597bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     fields.</li>
598bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *
599bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * </ul>
600bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *
601bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * @see          Date
602bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * @see          GregorianCalendar
603bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * @see          TimeZone
604bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * @see          DateFormat
60587255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert * @author Mark Davis, Deborah Goldsmith, Chen-Lieh Huang, Alan Liu, Laura Werner
606bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * @stable ICU 2.0
607bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert */
608bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubertpublic class Calendar implements Serializable, Cloneable, Comparable<Calendar> {
609bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    private static final long serialVersionUID = 1L;
610bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
611bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /**
612bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @internal
613bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     */
614bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public final java.util.Calendar calendar;
615bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
616bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /**
617bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @internal
618bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @param delegate the Calendar to which to delegate
619bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     */
620bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public Calendar(java.util.Calendar delegate) {
621bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        this.calendar = delegate;
622bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    }
623bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
624bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    // Data flow in Calendar
625bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    // ---------------------
626bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
627bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    // The current time is represented in two ways by Calendar: as UTC
628bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    // milliseconds from the epoch start (1 January 1970 0:00 UTC), and as local
629bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    // fields such as MONTH, HOUR, AM_PM, etc.  It is possible to compute the
630bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    // millis from the fields, and vice versa.  The data needed to do this
631bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    // conversion is encapsulated by a TimeZone object owned by the Calendar.
632bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    // The data provided by the TimeZone object may also be overridden if the
633bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    // user sets the ZONE_OFFSET and/or DST_OFFSET fields directly. The class
634bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    // keeps track of what information was most recently set by the caller, and
635bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    // uses that to compute any other information as needed.
636bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
637bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    // If the user sets the fields using set(), the data flow is as follows.
638bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    // This is implemented by the Calendar subclass's computeTime() method.
639bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    // During this process, certain fields may be ignored.  The disambiguation
640bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    // algorithm for resolving which fields to pay attention to is described
641bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    // above.
642bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
643bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    //   local fields (YEAR, MONTH, DATE, HOUR, MINUTE, etc.)
644bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    //           |
645bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    //           | Using Calendar-specific algorithm
646bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    //           V
647bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    //   local standard millis
648bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    //           |
649bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    //           | Using TimeZone or user-set ZONE_OFFSET / DST_OFFSET
650bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    //           V
651bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    //   UTC millis (in time data member)
652bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
653bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    // If the user sets the UTC millis using setTime(), the data flow is as
654bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    // follows.  This is implemented by the Calendar subclass's computeFields()
655bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    // method.
656bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
657bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    //   UTC millis (in time data member)
658bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    //           |
659bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    //           | Using TimeZone getOffset()
660bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    //           V
661bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    //   local standard millis
662bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    //           |
663bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    //           | Using Calendar-specific algorithm
664bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    //           V
665bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    //   local fields (YEAR, MONTH, DATE, HOUR, MINUTE, etc.)
666bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
667bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    // In general, a round trip from fields, through local and UTC millis, and
668bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    // back out to fields is made when necessary.  This is implemented by the
669bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    // complete() method.  Resolving a partial set of fields into a UTC millis
670bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    // value allows all remaining fields to be generated from that value.  If
671bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    // the Calendar is lenient, the fields are also renormalized to standard
672bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    // ranges when they are regenerated.
673bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
674bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /**
675bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * Field number for <code>get</code> and <code>set</code> indicating the
676bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * era, e.g., AD or BC in the Julian calendar. This is a calendar-specific
677bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * value; see subclass documentation.
678bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @see GregorianCalendar#AD
679bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @see GregorianCalendar#BC
680bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @stable ICU 2.0
681bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     */
682bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public final static int ERA = 0;
683bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
684bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /**
685bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * Field number for <code>get</code> and <code>set</code> indicating the
686bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * year. This is a calendar-specific value; see subclass documentation.
687bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @stable ICU 2.0
688bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     */
689bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public final static int YEAR = 1;
690bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
691bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /**
692bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * Field number for <code>get</code> and <code>set</code> indicating the
693bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * month. This is a calendar-specific value. The first month of the year is
694bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * <code>JANUARY</code>; the last depends on the number of months in a year.
695bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @see #JANUARY
696bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @see #FEBRUARY
697bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @see #MARCH
698bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @see #APRIL
699bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @see #MAY
700bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @see #JUNE
701bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @see #JULY
702bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @see #AUGUST
703bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @see #SEPTEMBER
704bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @see #OCTOBER
705bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @see #NOVEMBER
706bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @see #DECEMBER
707bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @see #UNDECIMBER
708bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @stable ICU 2.0
709bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     */
710bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public final static int MONTH = 2;
711bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
712bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /**
713bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * Field number for <code>get</code> and <code>set</code> indicating the
714bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * week number within the current year.  The first week of the year, as
715bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * defined by {@link #getFirstDayOfWeek()} and
716bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * {@link #getMinimalDaysInFirstWeek()}, has value 1.  Subclasses define
717bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * the value of {@link #WEEK_OF_YEAR} for days before the first week of
718bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * the year.
719bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @see #getFirstDayOfWeek
720bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @see #getMinimalDaysInFirstWeek
721bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @stable ICU 2.0
722bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     */
723bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public final static int WEEK_OF_YEAR = 3;
724bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
725bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /**
726bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * Field number for <code>get</code> and <code>set</code> indicating the
727bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * week number within the current month.  The first week of the month, as
728bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * defined by {@link #getFirstDayOfWeek()} and
729bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * {@link #getMinimalDaysInFirstWeek()}, has value 1.  Subclasses define
730bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * the value of {@link #WEEK_OF_MONTH} for days before the first week of
731bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * the month.
732bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @see #getFirstDayOfWeek
733bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @see #getMinimalDaysInFirstWeek
734bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @stable ICU 2.0
735bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     */
736bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public final static int WEEK_OF_MONTH = 4;
737bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
738bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /**
739bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * Field number for <code>get</code> and <code>set</code> indicating the
740bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * day of the month. This is a synonym for {@link #DAY_OF_MONTH}.
741bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * The first day of the month has value 1.
742bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @see #DAY_OF_MONTH
743bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @stable ICU 2.0
744bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     */
745bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public final static int DATE = 5;
746bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
747bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /**
748bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * Field number for <code>get</code> and <code>set</code> indicating the
749bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * day of the month. This is a synonym for {@link #DATE}.
750bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * The first day of the month has value 1.
751bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @see #DATE
752bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @stable ICU 2.0
753bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     */
754bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public final static int DAY_OF_MONTH = 5;
755bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
756bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /**
757bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * Field number for <code>get</code> and <code>set</code> indicating the day
758bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * number within the current year.  The first day of the year has value 1.
759bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @stable ICU 2.0
760bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     */
761bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public final static int DAY_OF_YEAR = 6;
762bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
763bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /**
764bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * Field number for <code>get</code> and <code>set</code> indicating the day
765bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * of the week.  This field takes values {@link #SUNDAY},
766bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * {@link #MONDAY}, {@link #TUESDAY}, {@link #WEDNESDAY},
767bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * {@link #THURSDAY}, {@link #FRIDAY}, and {@link #SATURDAY}.
768bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @see #SUNDAY
769bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @see #MONDAY
770bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @see #TUESDAY
771bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @see #WEDNESDAY
772bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @see #THURSDAY
773bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @see #FRIDAY
774bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @see #SATURDAY
775bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @stable ICU 2.0
776bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     */
777bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public final static int DAY_OF_WEEK = 7;
778bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
779bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /**
780bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * Field number for <code>get</code> and <code>set</code> indicating the
781bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * ordinal number of the day of the week within the current month. Together
782bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * with the {@link #DAY_OF_WEEK} field, this uniquely specifies a day
783bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * within a month.  Unlike {@link #WEEK_OF_MONTH} and
784bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * {@link #WEEK_OF_YEAR}, this field's value does <em>not</em> depend on
785bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * {@link #getFirstDayOfWeek()} or
786bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * {@link #getMinimalDaysInFirstWeek()}.  <code>DAY_OF_MONTH 1</code>
787bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * through <code>7</code> always correspond to <code>DAY_OF_WEEK_IN_MONTH
788bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * 1</code>; <code>8</code> through <code>15</code> correspond to
789bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * <code>DAY_OF_WEEK_IN_MONTH 2</code>, and so on.
790bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * <code>DAY_OF_WEEK_IN_MONTH 0</code> indicates the week before
791bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * <code>DAY_OF_WEEK_IN_MONTH 1</code>.  Negative values count back from the
792bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * end of the month, so the last Sunday of a month is specified as
793bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * <code>DAY_OF_WEEK = SUNDAY, DAY_OF_WEEK_IN_MONTH = -1</code>.  Because
794bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * negative values count backward they will usually be aligned differently
795bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * within the month than positive values.  For example, if a month has 31
796bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * days, <code>DAY_OF_WEEK_IN_MONTH -1</code> will overlap
797bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * <code>DAY_OF_WEEK_IN_MONTH 5</code> and the end of <code>4</code>.
798bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @see #DAY_OF_WEEK
799bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @see #WEEK_OF_MONTH
800bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @stable ICU 2.0
801bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     */
802bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public final static int DAY_OF_WEEK_IN_MONTH = 8;
803bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
804bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /**
805bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * Field number for <code>get</code> and <code>set</code> indicating
806bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * whether the <code>HOUR</code> is before or after noon.
807bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * E.g., at 10:04:15.250 PM the <code>AM_PM</code> is <code>PM</code>.
808bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @see #AM
809bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @see #PM
810bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @see #HOUR
811bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @stable ICU 2.0
812bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     */
813bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public final static int AM_PM = 9;
814bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
815bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /**
816bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * Field number for <code>get</code> and <code>set</code> indicating the
817bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * hour of the morning or afternoon. <code>HOUR</code> is used for the 12-hour
818bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * clock.
819bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * E.g., at 10:04:15.250 PM the <code>HOUR</code> is 10.
820bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @see #AM_PM
821bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @see #HOUR_OF_DAY
822bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @stable ICU 2.0
823bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     */
824bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public final static int HOUR = 10;
825bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
826bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /**
827bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * Field number for <code>get</code> and <code>set</code> indicating the
828bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * hour of the day. <code>HOUR_OF_DAY</code> is used for the 24-hour clock.
829bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * E.g., at 10:04:15.250 PM the <code>HOUR_OF_DAY</code> is 22.
830bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @see #HOUR
831bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @stable ICU 2.0
832bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     */
833bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public final static int HOUR_OF_DAY = 11;
834bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
835bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /**
836bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * Field number for <code>get</code> and <code>set</code> indicating the
837bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * minute within the hour.
838bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * E.g., at 10:04:15.250 PM the <code>MINUTE</code> is 4.
839bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @stable ICU 2.0
840bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     */
841bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public final static int MINUTE = 12;
842bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
843bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /**
844bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * Field number for <code>get</code> and <code>set</code> indicating the
845bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * second within the minute.
846bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * E.g., at 10:04:15.250 PM the <code>SECOND</code> is 15.
847bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @stable ICU 2.0
848bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     */
849bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public final static int SECOND = 13;
850bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
851bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /**
852bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * Field number for <code>get</code> and <code>set</code> indicating the
853bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * millisecond within the second.
854bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * E.g., at 10:04:15.250 PM the <code>MILLISECOND</code> is 250.
855bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @stable ICU 2.0
856bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     */
857bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public final static int MILLISECOND = 14;
858bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
859bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /**
860bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * Field number for <code>get</code> and <code>set</code> indicating the
861bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * raw offset from GMT in milliseconds.
862bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @stable ICU 2.0
863bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     */
864bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public final static int ZONE_OFFSET = 15;
865bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
866bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /**
867bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * Field number for <code>get</code> and <code>set</code> indicating the
868bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * daylight savings offset in milliseconds.
869bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @stable ICU 2.0
870bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     */
871bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public final static int DST_OFFSET = 16;
872bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
873bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//    /**
874bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * {@icu} Field number for <code>get()</code> and <code>set()</code>
875bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * indicating the extended year corresponding to the
876bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * {@link #WEEK_OF_YEAR} field.  This may be one greater or less
877bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * than the value of {@link #EXTENDED_YEAR}.
878bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * @stable ICU 2.0
879bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     */
880bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//    public static final int YEAR_WOY = 17;
881bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//
882bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//    /**
883bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * {@icu} Field number for <code>get()</code> and <code>set()</code>
884bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * indicating the localized day of week.  This will be a value from 1
885bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * to 7 inclusive, with 1 being the localized first day of the week.
886bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * @stable ICU 2.0
887bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     */
888bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//    public static final int DOW_LOCAL = 18;
889bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//
890bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//    /**
891bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * {@icu} Field number for <code>get()</code> and <code>set()</code>
892bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * indicating the extended year.  This is a single number designating
893bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * the year of this calendar system, encompassing all supra-year
894bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * fields.  For example, for the Julian calendar system, year numbers
895bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * are positive, with an era of BCE or CE.  An extended year value for
896bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * the Julian calendar system assigns positive values to CE years and
897bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * negative values to BCE years, with 1 BCE being year 0.
898bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * @stable ICU 2.0
899bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     */
900bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//    public static final int EXTENDED_YEAR = 19;
901bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//
902bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//    /**
903bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * {@icu} Field number for <code>get()</code> and <code>set()</code>
904bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * indicating the modified Julian day number.  This is different from
905bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * the conventional Julian day number in two regards.  First, it
906bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * demarcates days at local zone midnight, rather than noon GMT.
907bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * Second, it is a local number; that is, it depends on the local time
908bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * zone.  It can be thought of as a single number that encompasses all
909bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * the date-related fields.
910bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * @stable ICU 2.0
911bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     */
912bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//    public static final int JULIAN_DAY = 20;
913bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//
914bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//    /**
915bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * {@icu} Field number for <code>get()</code> and <code>set()</code>
916bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * indicating the milliseconds in the day.  This ranges from 0 to
917bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * 23:59:59.999 (regardless of DST).  This field behaves
918bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * <em>exactly</em> like a composite of all time-related fields, not
919bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * including the zone fields.  As such, it also reflects
920bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * discontinuities of those fields on DST transition days.  On a day of
921bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * DST onset, it will jump forward.  On a day of DST cessation, it will
922bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * jump backward.  This reflects the fact that is must be combined with
923bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * the DST_OFFSET field to obtain a unique local time value.
924bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * @stable ICU 2.0
925bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     */
926bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//    public static final int MILLISECONDS_IN_DAY = 21;
927bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//
928bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//    /**
929bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * {@icu} Field indicating whether or not the current month is a leap month.
930bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * Should have a value of 0 for non-leap months, and 1 for leap months.
931bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * @draft ICU 4.4
932bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * @provisional This API might change or be removed in a future release.
933bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     */
934bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//    public static final int IS_LEAP_MONTH = 22;
935bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
936bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /**
937bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * Value of the <code>DAY_OF_WEEK</code> field indicating
938bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * Sunday.
939bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @stable ICU 2.0
940bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     */
941bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public final static int SUNDAY = 1;
942bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
943bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /**
944bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * Value of the <code>DAY_OF_WEEK</code> field indicating
945bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * Monday.
946bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @stable ICU 2.0
947bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     */
948bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public final static int MONDAY = 2;
949bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
950bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /**
951bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * Value of the <code>DAY_OF_WEEK</code> field indicating
952bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * Tuesday.
953bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @stable ICU 2.0
954bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     */
955bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public final static int TUESDAY = 3;
956bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
957bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /**
958bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * Value of the <code>DAY_OF_WEEK</code> field indicating
959bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * Wednesday.
960bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @stable ICU 2.0
961bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     */
962bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public final static int WEDNESDAY = 4;
963bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
964bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /**
965bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * Value of the <code>DAY_OF_WEEK</code> field indicating
966bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * Thursday.
967bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @stable ICU 2.0
968bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     */
969bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public final static int THURSDAY = 5;
970bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
971bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /**
972bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * Value of the <code>DAY_OF_WEEK</code> field indicating
973bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * Friday.
974bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @stable ICU 2.0
975bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     */
976bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public final static int FRIDAY = 6;
977bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
978bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /**
979bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * Value of the <code>DAY_OF_WEEK</code> field indicating
980bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * Saturday.
981bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @stable ICU 2.0
982bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     */
983bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public final static int SATURDAY = 7;
984bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
985bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /**
986bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * Value of the <code>MONTH</code> field indicating the
987bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * first month of the year.
988bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @stable ICU 2.0
989bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     */
990bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public final static int JANUARY = 0;
991bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
992bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /**
993bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * Value of the <code>MONTH</code> field indicating the
994bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * second month of the year.
995bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @stable ICU 2.0
996bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     */
997bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public final static int FEBRUARY = 1;
998bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
999bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /**
1000bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * Value of the <code>MONTH</code> field indicating the
1001bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * third month of the year.
1002bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @stable ICU 2.0
1003bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     */
1004bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public final static int MARCH = 2;
1005bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
1006bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /**
1007bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * Value of the <code>MONTH</code> field indicating the
1008bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * fourth month of the year.
1009bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @stable ICU 2.0
1010bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     */
1011bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public final static int APRIL = 3;
1012bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
1013bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /**
1014bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * Value of the <code>MONTH</code> field indicating the
1015bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * fifth month of the year.
1016bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @stable ICU 2.0
1017bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     */
1018bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public final static int MAY = 4;
1019bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
1020bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /**
1021bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * Value of the <code>MONTH</code> field indicating the
1022bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * sixth month of the year.
1023bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @stable ICU 2.0
1024bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     */
1025bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public final static int JUNE = 5;
1026bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
1027bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /**
1028bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * Value of the <code>MONTH</code> field indicating the
1029bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * seventh month of the year.
1030bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @stable ICU 2.0
1031bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     */
1032bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public final static int JULY = 6;
1033bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
1034bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /**
1035bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * Value of the <code>MONTH</code> field indicating the
1036bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * eighth month of the year.
1037bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @stable ICU 2.0
1038bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     */
1039bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public final static int AUGUST = 7;
1040bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
1041bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /**
1042bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * Value of the <code>MONTH</code> field indicating the
1043bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * ninth month of the year.
1044bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @stable ICU 2.0
1045bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     */
1046bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public final static int SEPTEMBER = 8;
1047bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
1048bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /**
1049bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * Value of the <code>MONTH</code> field indicating the
1050bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * tenth month of the year.
1051bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @stable ICU 2.0
1052bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     */
1053bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public final static int OCTOBER = 9;
1054bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
1055bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /**
1056bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * Value of the <code>MONTH</code> field indicating the
1057bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * eleventh month of the year.
1058bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @stable ICU 2.0
1059bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     */
1060bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public final static int NOVEMBER = 10;
1061bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
1062bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /**
1063bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * Value of the <code>MONTH</code> field indicating the
1064bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * twelfth month of the year.
1065bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @stable ICU 2.0
1066bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     */
1067bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public final static int DECEMBER = 11;
1068bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
1069bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /**
1070bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * Value of the <code>MONTH</code> field indicating the
1071bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * thirteenth month of the year. Although {@link GregorianCalendar}
1072bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * does not use this value, lunar calendars do.
1073bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @stable ICU 2.0
1074bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     */
1075bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public final static int UNDECIMBER = 12;
1076bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
1077bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /**
1078bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * Value of the <code>AM_PM</code> field indicating the
1079bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * period of the day from midnight to just before noon.
1080bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @stable ICU 2.0
1081bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     */
1082bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public final static int AM = 0;
1083bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
1084bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /**
1085bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * Value of the <code>AM_PM</code> field indicating the
1086bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * period of the day from noon to just before midnight.
1087bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @stable ICU 2.0
1088bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     */
1089bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public final static int PM = 1;
1090bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
1091bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /**
1092bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * {@icu} Value returned by getDayOfWeekType(int dayOfWeek) to indicate a
1093bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * weekday.
1094bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @see #WEEKEND
1095bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @see #WEEKEND_ONSET
1096bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @see #WEEKEND_CEASE
1097bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @see #getDayOfWeekType
1098bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @stable ICU 2.0
1099bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     */
1100bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public static final int WEEKDAY = 0;
1101bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
1102bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /**
1103bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * {@icu} Value returned by getDayOfWeekType(int dayOfWeek) to indicate a
1104bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * weekend day.
1105bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @see #WEEKDAY
1106bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @see #WEEKEND_ONSET
1107bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @see #WEEKEND_CEASE
1108bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @see #getDayOfWeekType
1109bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @stable ICU 2.0
1110bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     */
1111bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public static final int WEEKEND = 1;
1112bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
1113bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /**
1114bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * {@icu} Value returned by getDayOfWeekType(int dayOfWeek) to indicate a
1115bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * day that starts as a weekday and transitions to the weekend.
1116bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * Call getWeekendTransition() to get the point of transition.
1117bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @see #WEEKDAY
1118bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @see #WEEKEND
1119bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @see #WEEKEND_CEASE
1120bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @see #getDayOfWeekType
1121bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @stable ICU 2.0
1122bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     */
1123bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public static final int WEEKEND_ONSET = 2;
1124bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
1125bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /**
1126bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * {@icu} Value returned by getDayOfWeekType(int dayOfWeek) to indicate a
1127bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * day that starts as the weekend and transitions to a weekday.
1128bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * Call getWeekendTransition() to get the point of transition.
1129bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @see #WEEKDAY
1130bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @see #WEEKEND
1131bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @see #WEEKEND_ONSET
1132bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @see #getDayOfWeekType
1133bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @stable ICU 2.0
1134bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     */
1135bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public static final int WEEKEND_CEASE = 3;
1136bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
1137bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /**
1138bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * {@icu}Option used by {@link #setRepeatedWallTimeOption(int)} and
1139bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * {@link #setSkippedWallTimeOption(int)} specifying an ambiguous wall time
1140bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * to be interpreted as the latest.
1141bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @see #setRepeatedWallTimeOption(int)
1142bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @see #getRepeatedWallTimeOption()
1143bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @see #setSkippedWallTimeOption(int)
1144bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @see #getSkippedWallTimeOption()
1145bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @draft ICU 49
1146bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @provisional This API might change or be removed in a future release.
1147bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     */
1148bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public static final int WALLTIME_LAST = 0;
1149bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
1150bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /**
1151bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * {@icu}Option used by {@link #setRepeatedWallTimeOption(int)} and
1152bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * {@link #setSkippedWallTimeOption(int)} specifying an ambiguous wall time
1153bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * to be interpreted as the earliest.
1154bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @see #setRepeatedWallTimeOption(int)
1155bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @see #getRepeatedWallTimeOption()
1156bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @see #setSkippedWallTimeOption(int)
1157bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @see #getSkippedWallTimeOption()
1158bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @draft ICU 49
1159bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @provisional This API might change or be removed in a future release.
1160bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     */
1161bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public static final int WALLTIME_FIRST = 1;
1162bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
1163bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /**
1164bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * {@icu}Option used by {@link #setSkippedWallTimeOption(int)} specifying an
1165bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * ambiguous wall time to be interpreted as the next valid wall time.
1166bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @see #setSkippedWallTimeOption(int)
1167bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @see #getSkippedWallTimeOption()
1168bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @draft ICU 49
1169bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @provisional This API might change or be removed in a future release.
1170bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     */
1171bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public static final int WALLTIME_NEXT_VALID = 2;
1172bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
1173bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /**
1174bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * Constructs a Calendar with the default time zone
1175bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * and locale.
1176bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @see     TimeZone#getDefault
1177bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @stable ICU 2.0
1178bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     */
1179bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    protected Calendar()
1180bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    {
1181bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        this(TimeZone.getDefault(), ULocale.getDefault(Category.FORMAT));
1182bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    }
1183bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
1184bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /**
1185bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * Constructs a calendar with the specified time zone and locale.
1186bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @param zone the time zone to use
1187bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @param aLocale the locale for the week data
1188bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @stable ICU 2.0
1189bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     */
1190bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    protected Calendar(TimeZone zone, Locale aLocale)
1191bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    {
1192bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        this(zone, ULocale.forLocale(aLocale));
1193bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    }
1194bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
1195bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /**
1196bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * Constructs a calendar with the specified time zone and locale.
1197bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @param zone the time zone to use
1198bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @param locale the ulocale for the week data
1199bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @stable ICU 3.2
1200bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     */
1201bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    protected Calendar(TimeZone zone, ULocale locale)
1202bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    {
1203bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        calendar = java.util.Calendar.getInstance(zone.timeZone, locale.toLocale());
1204bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    }
1205bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
1206bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /**
1207bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * Returns a calendar using the default time zone and locale.
1208bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @return a Calendar.
1209bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @stable ICU 2.0
1210bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     */
1211bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public static synchronized Calendar getInstance()
1212bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    {
1213bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        return new Calendar(java.util.Calendar.getInstance(ULocale.getDefault(Category.FORMAT).toLocale()));
1214bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    }
1215bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
1216bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /**
1217bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * Returns a calendar using the specified time zone and default locale.
1218bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @param zone the time zone to use
1219bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @return a Calendar.
1220bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @stable ICU 2.0
1221bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     */
1222bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public static synchronized Calendar getInstance(TimeZone zone)
1223bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    {
1224bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        return new Calendar(java.util.Calendar.getInstance(zone.timeZone, ULocale.getDefault(Category.FORMAT).toLocale()));
1225bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    }
1226bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
1227bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /**
1228bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * Returns a calendar using the default time zone and specified locale.
1229bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @param aLocale the locale for the week data
1230bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @return a Calendar.
1231bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @stable ICU 2.0
1232bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     */
1233bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public static synchronized Calendar getInstance(Locale aLocale)
1234bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    {
1235bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        return new Calendar(java.util.Calendar.getInstance(aLocale));
1236bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    }
1237bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
1238bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /**
1239bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * Returns a calendar using the default time zone and specified locale.
1240bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @param locale the ulocale for the week data
1241bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @return a Calendar.
1242bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @stable ICU 3.2
1243bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     */
1244bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public static synchronized Calendar getInstance(ULocale locale)
1245bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    {
1246bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        return new Calendar(java.util.Calendar.getInstance(locale.toLocale()));
1247bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    }
1248bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
1249bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /**
1250bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * Returns a calendar with the specified time zone and locale.
1251bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @param zone the time zone to use
1252bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @param aLocale the locale for the week data
1253bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @return a Calendar.
1254bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @stable ICU 2.0
1255bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     */
1256bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public static synchronized Calendar getInstance(TimeZone zone,
1257bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                                                    Locale aLocale) {
1258bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        return new Calendar(java.util.Calendar.getInstance(zone.timeZone, aLocale));
1259bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    }
1260bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
1261bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /**
1262bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * Returns a calendar with the specified time zone and locale.
1263bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @param zone the time zone to use
1264bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @param locale the ulocale for the week data
1265bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @return a Calendar.
1266bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @stable ICU 3.2
1267bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     */
1268bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public static synchronized Calendar getInstance(TimeZone zone,
1269bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                                                    ULocale locale) {
1270bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        return new Calendar(java.util.Calendar.getInstance(zone.timeZone, locale.toLocale()));
1271bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    }
1272bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
1273bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /**
1274bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * Returns the list of locales for which Calendars are installed.
1275bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @return the list of locales for which Calendars are installed.
1276bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @stable ICU 2.0
1277bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     */
1278bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public static Locale[] getAvailableLocales()
1279bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    {
1280bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        return java.util.Calendar.getAvailableLocales();
1281bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    }
1282bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
1283bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /**
1284bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * {@icu} Returns the list of locales for which Calendars are installed.
1285bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @return the list of locales for which Calendars are installed.
1286bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @draft ICU 3.2 (retain)
1287bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @provisional This API might change or be removed in a future release.
1288bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     */
1289bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public static ULocale[] getAvailableULocales()
1290bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    {
1291bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        if (availableLocales == null) {
1292bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            synchronized (Calendar.class) {
1293bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                if (availableLocales == null) {
1294bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    Locale[] locales = Locale.getAvailableLocales();
1295bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    availableLocales = new ULocale[locales.length];
1296bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    for (int i = 0; i < locales.length; i++) {
1297bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        availableLocales[i] = ULocale.forLocale(locales[i]);
1298bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    }
1299bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                }
1300bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            }
1301bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        }
1302bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        return availableLocales.clone();
1303bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    }
1304bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    private static volatile ULocale[] availableLocales;
1305bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
1306bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//    /**
1307bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * {@icu} Given a key and a locale, returns an array of string values in a preferred
1308bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * order that would make a difference. These are all and only those values where
1309bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * the open (creation) of the service with the locale formed from the input locale
1310bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * plus input keyword and that value has different behavior than creation with the
1311bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * input locale alone.
1312bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * @param key           one of the keys supported by this service.  For now, only
1313bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     *                      "calendar" is supported.
1314bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * @param locale        the locale
1315bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * @param commonlyUsed  if set to true it will return only commonly used values
1316bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     *                      with the given locale in preferred order.  Otherwise,
1317bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     *                      it will return all the available values for the locale.
1318bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * @return an array of string values for the given key and the locale.
1319bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * @stable ICU 4.2
1320bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     */
1321bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//    public static final String[] getKeywordValuesForLocale(String key, ULocale locale,
1322bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//                                                           boolean commonlyUsed) {
1323bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//        throw new UnsupportedOperationException("Method not supported by com.ibm.icu.base");
1324bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//    }
1325bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
1326bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /**
1327bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * Returns this Calendar's current time.
1328bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @return the current time.
1329bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @stable ICU 2.0
1330bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     */
1331bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public final Date getTime() {
1332bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        return calendar.getTime();
1333bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    }
1334bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
1335bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /**
1336bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * Sets this Calendar's current time with the given Date.
1337bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     *
1338bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * <p>Note: Calling <code>setTime</code> with
1339bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * <code>Date(Long.MAX_VALUE)</code> or <code>Date(Long.MIN_VALUE)</code>
1340bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * may yield incorrect field values from {@link #get(int)}.
1341bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @param date the given Date.
1342bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @stable ICU 2.0
1343bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     */
1344bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public final void setTime(Date date) {
1345bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        calendar.setTime(date);
1346bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    }
1347bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
1348bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /**
1349bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * Returns this Calendar's current time as a long.
1350bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @return the current time as UTC milliseconds from the epoch.
1351bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @stable ICU 2.0
1352bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     */
1353bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public long getTimeInMillis() {
1354bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        return calendar.getTimeInMillis();
1355bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    }
1356bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
1357bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /**
1358bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * Sets this Calendar's current time from the given long value.
1359bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @param millis the new time in UTC milliseconds from the epoch.
1360bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @stable ICU 2.0
1361bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     */
1362bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public void setTimeInMillis( long millis ) {
1363bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        calendar.setTimeInMillis(millis);
1364bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    }
1365bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
1366bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /**
1367bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * Returns the value for a given time field.
1368bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @param field the given time field.
1369bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @return the value for the given time field.
1370bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @stable ICU 2.0
1371bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     */
1372bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public final int get(int field)
1373bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    {
1374bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        return calendar.get(getJDKField(field));
1375bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    }
1376bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
1377bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /**
1378bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * Sets the time field with the given value.
1379bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @param field the given time field.
1380bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @param value the value to be set for the given time field.
1381bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @stable ICU 2.0
1382bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     */
1383bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public final void set(int field, int value)
1384bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    {
1385bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        calendar.set(getJDKField(field), value);
1386bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    }
1387bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
1388bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /**
1389bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * Sets the values for the fields year, month, and date.
1390bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * Previous values of other fields are retained.  If this is not desired,
1391bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * call {@link #clear()} first.
1392bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @param year the value used to set the YEAR time field.
1393bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @param month the value used to set the MONTH time field.
1394bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * Month value is 0-based. e.g., 0 for January.
1395bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @param date the value used to set the DATE time field.
1396bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @stable ICU 2.0
1397bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     */
1398bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public final void set(int year, int month, int date)
1399bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    {
1400bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        calendar.set(getJDKField(YEAR), year);
1401bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        calendar.set(getJDKField(MONTH), month);
1402bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        calendar.set(getJDKField(DATE), date);
1403bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    }
1404bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
1405bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /**
1406bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * Sets the values for the fields year, month, date, hour, and minute.
1407bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * Previous values of other fields are retained.  If this is not desired,
1408bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * call {@link #clear()} first.
1409bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @param year the value used to set the YEAR time field.
1410bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @param month the value used to set the MONTH time field.
1411bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * Month value is 0-based. e.g., 0 for January.
1412bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @param date the value used to set the DATE time field.
1413bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @param hour the value used to set the HOUR_OF_DAY time field.
1414bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @param minute the value used to set the MINUTE time field.
1415bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @stable ICU 2.0
1416bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     */
1417bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public final void set(int year, int month, int date, int hour, int minute)
1418bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    {
1419bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        calendar.set(getJDKField(YEAR), year);
1420bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        calendar.set(getJDKField(MONTH), month);
1421bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        calendar.set(getJDKField(DATE), date);
1422bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        calendar.set(getJDKField(HOUR_OF_DAY), hour);
1423bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        calendar.set(getJDKField(MINUTE), minute);
1424bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    }
1425bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
1426bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /**
1427bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * Sets the values for the fields year, month, date, hour, minute, and second.
1428bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * Previous values of other fields are retained.  If this is not desired,
1429bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * call {@link #clear} first.
1430bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @param year the value used to set the YEAR time field.
1431bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @param month the value used to set the MONTH time field.
1432bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * Month value is 0-based. e.g., 0 for January.
1433bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @param date the value used to set the DATE time field.
1434bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @param hour the value used to set the HOUR_OF_DAY time field.
1435bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @param minute the value used to set the MINUTE time field.
1436bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @param second the value used to set the SECOND time field.
1437bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @stable ICU 2.0
1438bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     */
1439bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public final void set(int year, int month, int date, int hour, int minute,
1440bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                          int second)
1441bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    {
1442bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        calendar.set(getJDKField(YEAR), year);
1443bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        calendar.set(getJDKField(MONTH), month);
1444bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        calendar.set(getJDKField(DATE), date);
1445bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        calendar.set(getJDKField(HOUR_OF_DAY), hour);
1446bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        calendar.set(getJDKField(MINUTE), minute);
1447bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        calendar.set(getJDKField(SECOND), second);
1448bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    }
1449bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
1450bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /**
1451bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * Clears the values of all the time fields.
1452bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @stable ICU 2.0
1453bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     */
1454bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public final void clear()
1455bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    {
1456bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        calendar.clear();
1457bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    }
1458bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
1459bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /**
1460bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * Clears the value in the given time field.
1461bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @param field the time field to be cleared.
1462bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @stable ICU 2.0
1463bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     */
1464bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public final void clear(int field)
1465bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    {
1466bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        calendar.clear(getJDKField(field));
1467bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    }
1468bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
1469bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /**
1470bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * Determines if the given time field has a value set.
1471bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @return true if the given time field has a value set; false otherwise.
1472bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @stable ICU 2.0
1473bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     */
1474bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public final boolean isSet(int field)
1475bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    {
1476bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        return calendar.isSet(getJDKField(field));
1477bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    }
1478bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
1479bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /**
1480bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * Compares this calendar to the specified object.
1481bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * The result is <code>true</code> if and only if the argument is
1482bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * not <code>null</code> and is a <code>Calendar</code> object that
1483bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * represents the same calendar as this object.
1484bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @param obj the object to compare with.
1485bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @return <code>true</code> if the objects are the same;
1486bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * <code>false</code> otherwise.
1487bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @stable ICU 2.0
1488bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     */
1489bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public boolean equals(Object obj) {
1490bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        try {
1491bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            return calendar.equals(((Calendar)obj).calendar);
1492bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        } catch (Exception e) {
1493bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            return false;
1494bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        }
1495bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    }
1496bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
1497bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /**
1498bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * {@icu} Returns true if the given Calendar object is equivalent to this
1499bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * one.  An equivalent Calendar will behave exactly as this one
1500bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * does, but it may be set to a different time.  By contrast, for
1501bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * the equals() method to return true, the other Calendar must
1502bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * be set to the same time.
1503bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     *
1504bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @param other the Calendar to be compared with this Calendar
1505bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @stable ICU 2.4
1506bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     */
1507bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public boolean isEquivalentTo(Calendar other) {
1508bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        return calendar.getClass() == other.calendar.getClass() &&
1509bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            calendar.isLenient() == other.calendar.isLenient() &&
1510bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            calendar.getFirstDayOfWeek() == other.calendar.getFirstDayOfWeek() &&
1511bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            calendar.getMinimalDaysInFirstWeek() == other.calendar.getMinimalDaysInFirstWeek() &&
1512bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            calendar.getTimeZone().equals(other.calendar.getTimeZone());
1513bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    }
1514bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
1515bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /**
1516bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * Returns a hash code for this calendar.
1517bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @return a hash code value for this object.
1518bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @stable ICU 2.0
1519bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     */
1520bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public int hashCode() {
1521bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        return calendar.hashCode();
1522bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    }
1523bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
1524bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /**
1525bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * Returns the difference in milliseconds between the moment this
1526bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * calendar is set to and the moment the given calendar or Date object
1527bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * is set to.
1528bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     */
1529bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    private long compare(Object that) {
1530bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        long thatMs;
1531bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        if (that instanceof Calendar) {
1532bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            thatMs = ((Calendar)that).getTimeInMillis();
1533bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        } else if (that instanceof Date) {
1534bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            thatMs = ((Date)that).getTime();
1535bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        } else {
1536bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            throw new IllegalArgumentException(that + "is not a Calendar or Date");
1537bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        }
1538bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        return getTimeInMillis() - thatMs;
1539bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    }
1540bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
1541bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /**
1542bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * Compares the time field records.
1543bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * Equivalent to comparing result of conversion to UTC.
1544bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @param when the Calendar to be compared with this Calendar.
1545bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @return true if the current time of this Calendar is before
1546bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * the time of Calendar when; false otherwise.
1547bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @stable ICU 2.0
1548bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     */
1549bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public boolean before(Object when) {
1550bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        return compare(when) < 0;
1551bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    }
1552bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
1553bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /**
1554bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * Compares the time field records.
1555bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * Equivalent to comparing result of conversion to UTC.
1556bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @param when the Calendar to be compared with this Calendar.
1557bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @return true if the current time of this Calendar is after
1558bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * the time of Calendar when; false otherwise.
1559bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @stable ICU 2.0
1560bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     */
1561bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public boolean after(Object when) {
1562bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        return compare(when) > 0;
1563bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    }
1564bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
1565bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /**
1566bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * Returns the maximum value that this field could have, given the
1567bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * current date.  For example, with the Gregorian date February 3, 1997
1568bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * and the {@link #DAY_OF_MONTH DAY_OF_MONTH} field, the actual maximum
1569bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * is 28; for February 3, 1996 it is 29.
1570bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     *
1571bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * <p>The actual maximum computation ignores smaller fields and the
1572bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * current value of like-sized fields.  For example, the actual maximum
1573bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * of the DAY_OF_YEAR or MONTH depends only on the year and supra-year
1574bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * fields.  The actual maximum of the DAY_OF_MONTH depends, in
1575bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * addition, on the MONTH field and any other fields at that
1576bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * granularity (such as IS_LEAP_MONTH).  The
1577bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * DAY_OF_WEEK_IN_MONTH field does not depend on the current
1578bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * DAY_OF_WEEK; it returns the maximum for any day of week in the
1579bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * current month.  Likewise for the WEEK_OF_MONTH and WEEK_OF_YEAR
1580bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * fields.
1581bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     *
1582bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @param field the field whose maximum is desired
1583bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @return the maximum of the given field for the current date of this calendar
1584bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @see #getMaximum
1585bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @see #getLeastMaximum
1586bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @stable ICU 2.0
1587bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     */
1588bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public int getActualMaximum(int field) {
1589bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        return calendar.getActualMaximum(getJDKField(field));
1590bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    }
1591bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
1592bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /**
1593bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * Returns the minimum value that this field could have, given the current date.
1594bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * For most fields, this is the same as {@link #getMinimum getMinimum}
1595bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * and {@link #getGreatestMinimum getGreatestMinimum}.  However, some fields,
1596bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * especially those related to week number, are more complicated.
1597bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * <p>
1598bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * For example, assume {@link #getMinimalDaysInFirstWeek getMinimalDaysInFirstWeek}
1599bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * returns 4 and {@link #getFirstDayOfWeek getFirstDayOfWeek} returns SUNDAY.
1600bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * If the first day of the month is Sunday, Monday, Tuesday, or Wednesday
1601bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * there will be four or more days in the first week, so it will be week number 1,
1602bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * and <code>getActualMinimum(WEEK_OF_MONTH)</code> will return 1.  However,
1603bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * if the first of the month is a Thursday, Friday, or Saturday, there are
1604bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * <em>not</em> four days in that week, so it is week number 0, and
1605bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * <code>getActualMinimum(WEEK_OF_MONTH)</code> will return 0.
1606bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * <p>
1607bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @param field the field whose actual minimum value is desired.
1608bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @return the minimum of the given field for the current date of this calendar
1609bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     *
1610bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @see #getMinimum
1611bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @see #getGreatestMinimum
1612bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @stable ICU 2.0
1613bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     */
1614bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public int getActualMinimum(int field) {
1615bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        return calendar.getActualMinimum(getJDKField(field));
1616bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    }
1617bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
1618bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /**
1619bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * Rolls (up/down) a single unit of time on the given field.  If the
1620bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * field is rolled past its maximum allowable value, it will "wrap" back
1621bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * to its minimum and continue rolling. For
1622bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * example, to roll the current date up by one day, you can call:
1623bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * <p>
1624bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * <code>roll({@link #DATE}, true)</code>
1625bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * <p>
1626bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * When rolling on the {@link #YEAR} field, it will roll the year
1627bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * value in the range between 1 and the value returned by calling
1628bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * {@link #getMaximum getMaximum}({@link #YEAR}).
1629bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * <p>
1630bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * When rolling on certain fields, the values of other fields may conflict and
1631bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * need to be changed.  For example, when rolling the <code>MONTH</code> field
1632bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * for the Gregorian date 1/31/96 upward, the <code>DAY_OF_MONTH</code> field
1633bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * must be adjusted so that the result is 2/29/96 rather than the invalid
1634bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * 2/31/96.
1635bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * <p>
1636bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * <b>Note:</b> Calling <tt>roll(field, true)</tt> N times is <em>not</em>
1637bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * necessarily equivalent to calling <tt>roll(field, N)</tt>.  For example,
1638bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * imagine that you start with the date Gregorian date January 31, 1995.  If you call
1639bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * <tt>roll(Calendar.MONTH, 2)</tt>, the result will be March 31, 1995.
1640bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * But if you call <tt>roll(Calendar.MONTH, true)</tt>, the result will be
1641bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * February 28, 1995.  Calling it one more time will give March 28, 1995, which
1642bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * is usually not the desired result.
1643bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * <p>
1644bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * <b>Note:</b> You should always use <tt>roll</tt> and <tt>add</tt> rather
1645bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * than attempting to perform arithmetic operations directly on the fields
1646bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * of a <tt>Calendar</tt>.  It is quite possible for <tt>Calendar</tt> subclasses
1647bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * to have fields with non-linear behavior, for example missing months
1648bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * or days during non-leap years.  The subclasses' <tt>add</tt> and <tt>roll</tt>
1649bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * methods will take this into account, while simple arithmetic manipulations
1650bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * may give invalid results.
1651bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * <p>
1652bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @param field the calendar field to roll.
1653bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     *
1654bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @param up    indicates if the value of the specified time field is to be
1655bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     *              rolled up or rolled down. Use <code>true</code> if rolling up,
1656bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     *              <code>false</code> otherwise.
1657bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     *
1658bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @exception   IllegalArgumentException if the field is invalid or refers
1659bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     *              to a field that cannot be handled by this method.
1660bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @see #roll(int, int)
1661bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @see #add
1662bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @stable ICU 2.0
1663bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     */
1664bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public final void roll(int field, boolean up)
1665bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    {
1666bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        calendar.roll(getJDKField(field), up);
1667bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    }
1668bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
1669bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /**
1670bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * Rolls (up/down) a specified amount time on the given field.  For
1671bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * example, to roll the current date up by three days, you can call
1672bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * <code>roll(Calendar.DATE, 3)</code>.  If the
1673bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * field is rolled past its maximum allowable value, it will "wrap" back
1674bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * to its minimum and continue rolling.
1675bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * For example, calling <code>roll(Calendar.DATE, 10)</code>
1676bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * on a Gregorian calendar set to 4/25/96 will result in the date 4/5/96.
1677bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * <p>
1678bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * When rolling on certain fields, the values of other fields may conflict and
1679bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * need to be changed.  For example, when rolling the {@link #MONTH MONTH} field
1680bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * for the Gregorian date 1/31/96 by +1, the {@link #DAY_OF_MONTH DAY_OF_MONTH} field
1681bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * must be adjusted so that the result is 2/29/96 rather than the invalid
1682bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * 2/31/96.
1683bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * <p>
1684bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * {@icunote} the ICU implementation of this method is able to roll
1685bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * all fields except for {@link #ERA ERA}, {@link #DST_OFFSET DST_OFFSET},
1686bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * and {@link #ZONE_OFFSET ZONE_OFFSET}.  Subclasses may, of course, add support for
1687bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * additional fields in their overrides of <code>roll</code>.
1688bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * <p>
1689bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * <b>Note:</b> You should always use <tt>roll</tt> and <tt>add</tt> rather
1690bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * than attempting to perform arithmetic operations directly on the fields
1691bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * of a <tt>Calendar</tt>.  It is quite possible for <tt>Calendar</tt> subclasses
1692bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * to have fields with non-linear behavior, for example missing months
1693bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * or days during non-leap years.  The subclasses' <tt>add</tt> and <tt>roll</tt>
1694bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * methods will take this into account, while simple arithmetic manipulations
1695bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * may give invalid results.
1696bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * <p>
1697bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * <b>Subclassing:</b><br>
1698bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * This implementation of <code>roll</code> assumes that the behavior of the
1699bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * field is continuous between its minimum and maximum, which are found by
1700bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * calling {@link #getActualMinimum getActualMinimum} and {@link #getActualMaximum getActualMaximum}.
1701bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * For most such fields, simple addition, subtraction, and modulus operations
1702bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * are sufficient to perform the roll.  For week-related fields,
1703bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * the results of {@link #getFirstDayOfWeek getFirstDayOfWeek} and
1704bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * {@link #getMinimalDaysInFirstWeek getMinimalDaysInFirstWeek} are also necessary.
1705bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * Subclasses can override these two methods if their values differ from the defaults.
1706bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * <p>
1707bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * Subclasses that have fields for which the assumption of continuity breaks
1708bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * down must overide <code>roll</code> to handle those fields specially.
1709bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * For example, in the Hebrew calendar the month "Adar I"
1710bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * only occurs in leap years; in other years the calendar jumps from
1711bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * Shevat (month #4) to Adar (month #6).  The
1712bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * {@link HebrewCalendar#roll HebrewCalendar.roll} method takes this into account,
1713bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * so that rolling the month of Shevat by one gives the proper result (Adar) in a
1714bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * non-leap year.
1715bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * <p>
1716bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @param field     the calendar field to roll.
1717bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @param amount    the amount by which the field should be rolled.
1718bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     *
1719bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @exception   IllegalArgumentException if the field is invalid or refers
1720bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     *              to a field that cannot be handled by this method.
1721bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @see #roll(int, boolean)
1722bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @see #add
1723bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @stable ICU 2.0
1724bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     */
1725bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public void roll(int field, int amount) {
1726bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        calendar.roll(getJDKField(field), amount);
1727bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    }
1728bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
1729bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /**
1730bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * Add a signed amount to a specified field, using this calendar's rules.
1731bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * For example, to add three days to the current date, you can call
1732bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * <code>add(Calendar.DATE, 3)</code>.
1733bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * <p>
1734bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * When adding to certain fields, the values of other fields may conflict and
1735bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * need to be changed.  For example, when adding one to the {@link #MONTH MONTH} field
1736bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * for the Gregorian date 1/31/96, the {@link #DAY_OF_MONTH DAY_OF_MONTH} field
1737bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * must be adjusted so that the result is 2/29/96 rather than the invalid
1738bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * 2/31/96.
1739bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * <p>
1740bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * {@icunote} The ICU implementation of this method is able to add to
1741bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * all fields except for {@link #ERA ERA}, {@link #DST_OFFSET DST_OFFSET},
1742bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * and {@link #ZONE_OFFSET ZONE_OFFSET}.  Subclasses may, of course, add support for
1743bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * additional fields in their overrides of <code>add</code>.
1744bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * <p>
1745bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * <b>Note:</b> You should always use <tt>roll</tt> and <tt>add</tt> rather
1746bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * than attempting to perform arithmetic operations directly on the fields
1747bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * of a <tt>Calendar</tt>.  It is quite possible for <tt>Calendar</tt> subclasses
1748bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * to have fields with non-linear behavior, for example missing months
1749bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * or days during non-leap years.  The subclasses' <tt>add</tt> and <tt>roll</tt>
1750bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * methods will take this into account, while simple arithmetic manipulations
1751bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * may give invalid results.
1752bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * <p>
1753bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * <b>Subclassing:</b><br>
1754bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * This implementation of <code>add</code> assumes that the behavior of the
1755bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * field is continuous between its minimum and maximum, which are found by
1756bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * calling {@link #getActualMinimum getActualMinimum} and
1757bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * {@link #getActualMaximum getActualMaximum}.
1758bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * For such fields, simple arithmetic operations are sufficient to
1759bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * perform the add.
1760bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * <p>
1761bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * Subclasses that have fields for which this assumption of continuity breaks
1762bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * down must overide <code>add</code> to handle those fields specially.
1763bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * For example, in the Hebrew calendar the month "Adar I"
1764bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * only occurs in leap years; in other years the calendar jumps from
1765bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * Shevat (month #4) to Adar (month #6).  The
1766bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * {@link HebrewCalendar#add HebrewCalendar.add} method takes this into account,
1767bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * so that adding one month
1768bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * to a date in Shevat gives the proper result (Adar) in a non-leap year.
1769bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * <p>
1770bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @param field     the time field.
1771bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @param amount    the amount to add to the field.
1772bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     *
1773bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @exception   IllegalArgumentException if the field is invalid or refers
1774bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     *              to a field that cannot be handled by this method.
1775bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @see #roll(int, int)
1776bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @stable ICU 2.0
1777bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     */
1778bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public void add(int field, int amount) {
1779bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        calendar.add(getJDKField(field), amount);
1780bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    }
1781bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
1782bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    private static String _getDisplayName(Calendar cal) {
1783bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        String type = cal.getType();
1784bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        if (type.equals("japanese")) {
1785bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            return "Japanese Calendar";
1786bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        } else if (type.equals("buddhist")) {
1787bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            return "Buddhist Calendar";
1788bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        }
1789bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        return "Gregorian Calendar";
1790bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    }
1791bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
1792bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /**
1793bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * Returns the name of this calendar in the language of the given locale.
1794bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @stable ICU 2.0
1795bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     */
1796bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public String getDisplayName(Locale loc) {
1797bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        return _getDisplayName(this);
1798bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    }
1799bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
1800bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /**
1801bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * Returns the name of this calendar in the language of the given locale.
1802bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @stable ICU 3.2
1803bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     */
1804bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public String getDisplayName(ULocale loc) {
1805bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        return _getDisplayName(this);
1806bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    }
1807bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
1808bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /**
1809bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * Compares the times (in millis) represented by two
1810bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * <code>Calendar</code> objects.
1811bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     *
1812bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @param that the <code>Calendar</code> to compare to this.
1813bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @return <code>0</code> if the time represented by
1814bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * this <code>Calendar</code> is equal to the time represented
1815bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * by that <code>Calendar</code>, a value less than
1816bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * <code>0</code> if the time represented by this is before
1817bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * the time represented by that, and a value greater than
1818bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * <code>0</code> if the time represented by this
1819bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * is after the time represented by that.
1820bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @throws NullPointerException if that
1821bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * <code>Calendar</code> is null.
1822bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @throws IllegalArgumentException if the time of that
1823bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * <code>Calendar</code> can't be obtained because of invalid
1824bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * calendar values.
1825bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @stable ICU 3.4
1826bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     */
1827bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public int compareTo(Calendar that) {
1828bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        return calendar.compareTo(that.calendar);
1829bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    }
1830bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
1831bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    //-------------------------------------------------------------------------
1832bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    // Interface for creating custon DateFormats for different types of Calendars
1833bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    //-------------------------------------------------------------------------
1834bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
1835bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /**
1836bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * {@icu} Returns a <code>DateFormat</code> appropriate to this calendar.
1837bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * Subclasses wishing to specialize this behavior should override
1838bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * {@link #handleGetDateFormat}.
1839bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @stable ICU 2.0
1840bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     */
1841bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public DateFormat getDateTimeFormat(int dateStyle, int timeStyle, Locale loc) {
1842bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        if (dateStyle != DateFormat.NONE) {
1843bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            if (timeStyle == DateFormat.NONE) {
1844bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                return DateFormat.getDateInstance((Calendar)this.clone(), dateStyle, loc);
1845bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            } else {
1846bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                return DateFormat.getDateTimeInstance((Calendar)this.clone(), dateStyle, timeStyle, loc);
1847bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            }
1848bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        } else if (timeStyle != DateFormat.NONE) {
1849bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            return DateFormat.getTimeInstance((Calendar)this.clone(), timeStyle, loc);
1850bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        } else {
1851bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            return null;
1852bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        }
1853bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    }
1854bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
1855bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /**
1856bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * {@icu} Returns a <code>DateFormat</code> appropriate to this calendar.
1857bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * Subclasses wishing to specialize this behavior should override
1858bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * {@link #handleGetDateFormat}.
1859bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @stable ICU 3.2
1860bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     */
1861bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public DateFormat getDateTimeFormat(int dateStyle, int timeStyle, ULocale loc) {
1862bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        return getDateTimeFormat(dateStyle, timeStyle, loc.toLocale());
1863bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    }
1864bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
1865bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    //-------------------------------------------------------------------------
1866bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    // Constants
1867bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    //-------------------------------------------------------------------------
1868bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
1869bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /**
1870bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * {@icu} Returns the difference between the given time and the time this
1871bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * calendar object is set to.  If this calendar is set
1872bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * <em>before</em> the given time, the returned value will be
1873bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * positive.  If this calendar is set <em>after</em> the given
1874bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * time, the returned value will be negative.  The
1875bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * <code>field</code> parameter specifies the units of the return
1876bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * value.  For example, if <code>fieldDifference(when,
1877bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * Calendar.MONTH)</code> returns 3, then this calendar is set to
1878bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * 3 months before <code>when</code>, and possibly some additional
1879bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * time less than one month.
1880bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     *
1881bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * <p>As a side effect of this call, this calendar is advanced
1882bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * toward <code>when</code> by the given amount.  That is, calling
1883bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * this method has the side effect of calling <code>add(field,
1884bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * n)</code>, where <code>n</code> is the return value.
1885bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     *
1886bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * <p>Usage: To use this method, call it first with the largest
1887bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * field of interest, then with progressively smaller fields.  For
1888bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * example:
1889bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     *
1890bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * <pre>
1891bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * int y = cal.fieldDifference(when, Calendar.YEAR);
1892bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * int m = cal.fieldDifference(when, Calendar.MONTH);
1893bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * int d = cal.fieldDifference(when, Calendar.DATE);</pre>
1894bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     *
1895bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * computes the difference between <code>cal</code> and
1896bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * <code>when</code> in years, months, and days.
1897bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     *
1898bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * <p>Note: <code>fieldDifference()</code> is
1899bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * <em>asymmetrical</em>.  That is, in the following code:
1900bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     *
1901bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * <pre>
1902bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * cal.setTime(date1);
1903bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * int m1 = cal.fieldDifference(date2, Calendar.MONTH);
1904bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * int d1 = cal.fieldDifference(date2, Calendar.DATE);
1905bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * cal.setTime(date2);
1906bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * int m2 = cal.fieldDifference(date1, Calendar.MONTH);
1907bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * int d2 = cal.fieldDifference(date1, Calendar.DATE);</pre>
1908bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     *
1909bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * one might expect that <code>m1 == -m2 && d1 == -d2</code>.
1910bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * However, this is not generally the case, because of
1911bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * irregularities in the underlying calendar system (e.g., the
1912bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * Gregorian calendar has a varying number of days per month).
1913bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     *
1914bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @param when the date to compare this calendar's time to
1915bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @param field the field in which to compute the result
1916bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @return the difference, either positive or negative, between
1917bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * this calendar's time and <code>when</code>, in terms of
1918bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * <code>field</code>.
1919bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @stable ICU 2.0
1920bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     */
1921bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public int fieldDifference(Date when, int field) {
1922bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        int min = 0;
1923bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        long startMs = getTimeInMillis();
1924bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        long targetMs = when.getTime();
1925bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        // Always add from the start millis.  This accomodates
1926bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        // operations like adding years from February 29, 2000 up to
1927bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        // February 29, 2004.  If 1, 1, 1, 1 is added to the year
1928bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        // field, the DOM gets pinned to 28 and stays there, giving an
1929bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        // incorrect DOM difference of 1.  We have to add 1, reset, 2,
1930bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        // reset, 3, reset, 4.
1931bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        if (startMs < targetMs) {
1932bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            int max = 1;
1933bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            // Find a value that is too large
1934bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            for (;;) {
1935bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                setTimeInMillis(startMs);
1936bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                add(field, max);
1937bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                long ms = getTimeInMillis();
1938bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                if (ms == targetMs) {
1939bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    return max;
1940bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                } else if (ms > targetMs) {
1941bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    break;
1942bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                } else {
1943bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    max <<= 1;
1944bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    if (max < 0) {
1945bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        // Field difference too large to fit into int
1946bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        throw new RuntimeException();
1947bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    }
1948bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                }
1949bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            }
1950bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            // Do a binary search
1951bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            while ((max - min) > 1) {
1952bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                int t = (min + max) / 2;
1953bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                setTimeInMillis(startMs);
1954bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                add(field, t);
1955bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                long ms = getTimeInMillis();
1956bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                if (ms == targetMs) {
1957bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    return t;
1958bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                } else if (ms > targetMs) {
1959bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    max = t;
1960bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                } else {
1961bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    min = t;
1962bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                }
1963bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            }
1964bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        } else if (startMs > targetMs) {
1965bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            //Eclipse stated the following is "dead code"
1966bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            /*if (false) {
1967bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                // This works, and makes the code smaller, but costs
1968bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                // an extra object creation and an extra couple cycles
1969bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                // of calendar computation.
1970bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                setTimeInMillis(targetMs);
1971bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                min = -fieldDifference(new Date(startMs), field);
1972bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            }*/
1973bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            int max = -1;
1974bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            // Find a value that is too small
1975bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            for (;;) {
1976bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                setTimeInMillis(startMs);
1977bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                add(field, max);
1978bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                long ms = getTimeInMillis();
1979bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                if (ms == targetMs) {
1980bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    return max;
1981bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                } else if (ms < targetMs) {
1982bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    break;
1983bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                } else {
1984bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    max <<= 1;
1985bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    if (max == 0) {
1986bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        // Field difference too large to fit into int
1987bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        throw new RuntimeException();
1988bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    }
1989bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                }
1990bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            }
1991bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            // Do a binary search
1992bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            while ((min - max) > 1) {
1993bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                int t = (min + max) / 2;
1994bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                setTimeInMillis(startMs);
1995bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                add(field, t);
1996bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                long ms = getTimeInMillis();
1997bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                if (ms == targetMs) {
1998bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    return t;
1999bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                } else if (ms < targetMs) {
2000bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    max = t;
2001bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                } else {
2002bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    min = t;
2003bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                }
2004bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            }
2005bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        }
2006bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        // Set calendar to end point
2007bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        setTimeInMillis(startMs);
2008bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        add(field, min);
2009bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        return min;
2010bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    }
2011bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
2012bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /**
2013bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * Sets the time zone with the given time zone value.
2014bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @param value the given time zone.
2015bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @stable ICU 2.0
2016bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     */
2017bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public void setTimeZone(TimeZone value)
2018bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    {
2019bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        calendar.setTimeZone(value.timeZone);
2020bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    }
2021bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
2022bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /**
2023bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * Returns the time zone.
2024bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @return the time zone object associated with this calendar.
2025bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @stable ICU 2.0
2026bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     */
2027bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public TimeZone getTimeZone()
2028bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    {
2029bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        return new TimeZone(calendar.getTimeZone());
2030bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    }
2031bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
2032bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /**
2033bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * Specify whether or not date/time interpretation is to be lenient.  With
2034bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * lenient interpretation, a date such as "February 942, 1996" will be
2035bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * treated as being equivalent to the 941st day after February 1, 1996.
2036bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * With strict interpretation, such dates will cause an exception to be
2037bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * thrown.
2038bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     *
2039bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @see DateFormat#setLenient
2040bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @stable ICU 2.0
2041bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     */
2042bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public void setLenient(boolean lenient)
2043bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    {
2044bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        calendar.setLenient(lenient);
2045bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    }
2046bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
2047bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /**
2048bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * Tell whether date/time interpretation is to be lenient.
2049bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @stable ICU 2.0
2050bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     */
2051bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public boolean isLenient()
2052bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    {
2053bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        return calendar.isLenient();
2054bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    }
2055bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
2056bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//    /**
2057bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * {@icu}Sets the behavior for handling wall time repeating multiple times
2058bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * at negative time zone offset transitions. For example, 1:30 AM on
2059bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * November 6, 2011 in US Eastern time (Ameirca/New_York) occurs twice;
2060bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * 1:30 AM EDT, then 1:30 AM EST one hour later. When <code>WALLTIME_FIRST</code>
2061bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * is used, the wall time 1:30AM in this example will be interpreted as 1:30 AM EDT
2062bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * (first occurrence). When <code>WALLTIME_LAST</code> is used, it will be
2063bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * interpreted as 1:30 AM EST (last occurrence). The default value is
2064bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * <code>WALLTIME_LAST</code>.
2065bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     *
2066bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * @param option the behavior for handling repeating wall time, either
2067bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * <code>WALLTIME_FIRST</code> or <code>WALLTIME_LAST</code>.
2068bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * @throws IllegalArgumentException when <code>option</code> is neither
2069bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * <code>WALLTIME_FIRST</code> nor <code>WALLTIME_LAST</code>.
2070bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     *
2071bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * @see #getRepeatedWallTimeOption()
2072bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * @see #WALLTIME_FIRST
2073bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * @see #WALLTIME_LAST
2074bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     *
2075bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * @draft ICU 49
2076bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * @provisional This API might change or be removed in a future release.
2077bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     */
2078bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//    public void setRepeatedWallTimeOption(int option) {
2079bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//        if (option != WALLTIME_LAST) {
2080bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//            throw new UnsupportedOperationException("The option not supported by com.ibm.icu.base");
2081bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//        }
2082bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//    }
2083bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
2084bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /**
2085bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * {@icu}Gets the behavior for handling wall time repeating multiple times
2086bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * at negative time zone offset transitions.
2087bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     *
2088bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @return the behavior for handling repeating wall time, either
2089bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * <code>WALLTIME_FIRST</code> or <code>WALLTIME_LAST</code>.
2090bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     *
2091bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @see #setRepeatedWallTimeOption(int)
2092bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @see #WALLTIME_FIRST
2093bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @see #WALLTIME_LAST
2094bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     *
2095bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @draft ICU 49
2096bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @provisional This API might change or be removed in a future release.
2097bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     */
2098bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public int getRepeatedWallTimeOption() {
2099bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        return WALLTIME_LAST;
2100bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    }
2101bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
2102bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//    /**
2103bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * {@icu}Sets the behavior for handling skipped wall time at positive time zone offset
2104bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * transitions. For example, 2:30 AM on March 13, 2011 in US Eastern time (America/New_York)
2105bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * does not exist because the wall time jump from 1:59 AM EST to 3:00 AM EDT. When
2106bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * <code>WALLTIME_FIRST</code> is used, 2:30 AM is interpreted as 30 minutes before 3:00 AM
2107bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * EDT, therefore, it will be resolved as 1:30 AM EST. When <code>WALLTIME_LAST</code>
2108bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * is used, 2:30 AM is interpreted as 31 minutes after 1:59 AM EST, therefore, it will be
2109bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * resolved as 3:30 AM EDT. When <code>WALLTIME_NEXT_VALID</code> is used, 2:30 AM will
2110bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * be resolved as next valid wall time, that is 3:00 AM EDT. The default value is
2111bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * <code>WALLTIME_LAST</code>.
2112bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * <p>
2113bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * <b>Note:</b>This option is effective only when this calendar is {@link #isLenient() lenient}.
2114bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * When the calendar is strict, such non-existing wall time will cause an exception.
2115bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     *
2116bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * @param option the behavior for handling skipped wall time at positive time zone
2117bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * offset transitions, one of <code>WALLTIME_FIRST</code>, <code>WALLTIME_LAST</code> and
2118bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * <code>WALLTIME_NEXT_VALID</code>.
2119bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * @throws IllegalArgumentException when <code>option</code> is not any of
2120bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * <code>WALLTIME_FIRST</code>, <code>WALLTIME_LAST</code> and <code>WALLTIME_NEXT_VALID</code>.
2121bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     *
2122bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * @see #getSkippedWallTimeOption()
2123bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * @see #WALLTIME_FIRST
2124bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * @see #WALLTIME_LAST
2125bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * @see #WALLTIME_NEXT_VALID
2126bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     *
2127bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * @draft ICU 49
2128bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * @provisional This API might change or be removed in a future release.
2129bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     */
2130bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//    public void setSkippedWallTimeOption(int option) {
2131bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//        if (option != WALLTIME_LAST) {
2132bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//            throw new UnsupportedOperationException("The option not supported by com.ibm.icu.base");
2133bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//        }
2134bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//    }
2135bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
2136bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /**
2137bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * {@icu}Gets the behavior for handling skipped wall time at positive time zone offset
2138bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * transitions.
2139bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     *
2140bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @return the behavior for handling skipped wall time, one of
2141bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * <code>WALLTIME_FIRST</code>, <code>WALLTIME_LAST</code> and <code>WALLTIME_NEXT_VALID</code>.
2142bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     *
2143bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @see #setSkippedWallTimeOption(int)
2144bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @see #WALLTIME_FIRST
2145bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @see #WALLTIME_LAST
2146bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @see #WALLTIME_NEXT_VALID
2147bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     *
2148bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @draft ICU 49
2149bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @provisional This API might change or be removed in a future release.
2150bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     */
2151bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public int getSkippedWallTimeOption() {
2152bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        return WALLTIME_LAST;
2153bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    }
2154bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
2155bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /**
2156bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * Sets what the first day of the week is; e.g., Sunday in US,
2157bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * Monday in France.
2158bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @param value the given first day of the week.
2159bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @stable ICU 2.0
2160bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     */
2161bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public void setFirstDayOfWeek(int value)
2162bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    {
2163bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        calendar.setFirstDayOfWeek(value);
2164bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    }
2165bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
2166bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /**
2167bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * Returns what the first day of the week is; e.g., Sunday in US,
2168bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * Monday in France.
2169bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @return the first day of the week.
2170bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @stable ICU 2.0
2171bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     */
2172bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public int getFirstDayOfWeek()
2173bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    {
2174bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        return calendar.getFirstDayOfWeek();
2175bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    }
2176bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
2177bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /**
2178bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * Sets what the minimal days required in the first week of the year are.
2179bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * For example, if the first week is defined as one that contains the first
2180bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * day of the first month of a year, call the method with value 1. If it
2181bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * must be a full week, use value 7.
2182bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @param value the given minimal days required in the first week
2183bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * of the year.
2184bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @stable ICU 2.0
2185bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     */
2186bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public void setMinimalDaysInFirstWeek(int value)
2187bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    {
2188bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        calendar.setMinimalDaysInFirstWeek(value);
2189bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    }
2190bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
2191bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /**
2192bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * Returns what the minimal days required in the first week of the year are;
2193bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * e.g., if the first week is defined as one that contains the first day
2194bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * of the first month of a year, getMinimalDaysInFirstWeek returns 1. If
2195bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * the minimal days required must be a full week, getMinimalDaysInFirstWeek
2196bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * returns 7.
2197bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @return the minimal days required in the first week of the year.
2198bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @stable ICU 2.0
2199bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     */
2200bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public int getMinimalDaysInFirstWeek()
2201bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    {
2202bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        return calendar.getMinimalDaysInFirstWeek();
2203bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    }
2204bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
2205bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /**
2206bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * Returns the minimum value for the given time field.
2207bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * e.g., for Gregorian DAY_OF_MONTH, 1.
2208bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @param field the given time field.
2209bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @return the minimum value for the given time field.
2210bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @stable ICU 2.0
2211bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     */
2212bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public final int getMinimum(int field) {
2213bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        return calendar.getMinimum(getJDKField(field));
2214bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    }
2215bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
2216bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /**
2217bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * Returns the maximum value for the given time field.
2218bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * e.g. for Gregorian DAY_OF_MONTH, 31.
2219bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @param field the given time field.
2220bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @return the maximum value for the given time field.
2221bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @stable ICU 2.0
2222bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     */
2223bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public final int getMaximum(int field) {
2224bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        return calendar.getMaximum(getJDKField(field));
2225bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    }
2226bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
2227bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /**
2228bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * Returns the highest minimum value for the given field if varies.
2229bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * Otherwise same as getMinimum(). For Gregorian, no difference.
2230bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @param field the given time field.
2231bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @return the highest minimum value for the given time field.
2232bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @stable ICU 2.0
2233bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     */
2234bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public final int getGreatestMinimum(int field) {
2235bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        return calendar.getGreatestMinimum(getJDKField(field));
2236bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    }
2237bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
2238bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /**
2239bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * Returns the lowest maximum value for the given field if varies.
2240bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * Otherwise same as getMaximum(). e.g., for Gregorian DAY_OF_MONTH, 28.
2241bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @param field the given time field.
2242bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @return the lowest maximum value for the given time field.
2243bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @stable ICU 2.0
2244bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     */
2245bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public final int getLeastMaximum(int field) {
2246bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        return calendar.getLeastMaximum(getJDKField(field));
2247bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    }
2248bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
2249bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    //-------------------------------------------------------------------------
2250bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    // Weekend support -- determining which days of the week are the weekend
2251bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    // in a given locale
2252bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    //-------------------------------------------------------------------------
2253bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
2254bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /**
2255bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * {@icu} Returns whether the given day of the week is a weekday, a
2256bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * weekend day, or a day that transitions from one to the other,
2257bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * in this calendar system.  If a transition occurs at midnight,
2258bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * then the days before and after the transition will have the
2259bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * type WEEKDAY or WEEKEND.  If a transition occurs at a time
2260bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * other than midnight, then the day of the transition will have
2261bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * the type WEEKEND_ONSET or WEEKEND_CEASE.  In this case, the
2262bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * method getWeekendTransition() will return the point of
2263bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * transition.
2264bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @param dayOfWeek either SUNDAY, MONDAY, TUESDAY, WEDNESDAY,
2265bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * THURSDAY, FRIDAY, or SATURDAY
2266bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @return either WEEKDAY, WEEKEND, WEEKEND_ONSET, or
2267bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * WEEKEND_CEASE
2268bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @exception IllegalArgumentException if dayOfWeek is not
2269bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * between SUNDAY and SATURDAY, inclusive
2270bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @see #WEEKDAY
2271bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @see #WEEKEND
2272bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @see #WEEKEND_ONSET
2273bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @see #WEEKEND_CEASE
2274bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @see #getWeekendTransition
2275bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @see #isWeekend(Date)
2276bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @see #isWeekend()
2277bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @stable ICU 2.0
2278bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     */
2279bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public int getDayOfWeekType(int dayOfWeek) {
2280bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        // weekend always full saturday and sunday with com.ibm.icu.base
2281bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        if (dayOfWeek < SUNDAY || dayOfWeek > 7) {
2282bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            throw new IllegalArgumentException("illegal day of week: " + dayOfWeek);
2283bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        } else if (dayOfWeek == SATURDAY || dayOfWeek == SUNDAY) {
2284bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            return WEEKEND;
2285bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        }
2286bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        return WEEKDAY;}
2287bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
2288bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//    /**
2289bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * {@icu} Returns the time during the day at which the weekend begins or end in this
2290bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * calendar system.  If getDayOfWeekType(dayOfWeek) == WEEKEND_ONSET return the time
2291bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * at which the weekend begins.  If getDayOfWeekType(dayOfWeek) == WEEKEND_CEASE
2292bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * return the time at which the weekend ends.  If getDayOfWeekType(dayOfWeek) has some
2293bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * other value, then throw an exception.
2294bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * @param dayOfWeek either SUNDAY, MONDAY, TUESDAY, WEDNESDAY,
2295bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * THURSDAY, FRIDAY, or SATURDAY
2296bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * @return the milliseconds after midnight at which the
2297bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * weekend begins or ends
2298bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * @exception IllegalArgumentException if dayOfWeek is not
2299bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * WEEKEND_ONSET or WEEKEND_CEASE
2300bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * @see #getDayOfWeekType
2301bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * @see #isWeekend(Date)
2302bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * @see #isWeekend()
2303bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * @stable ICU 2.0
2304bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     */
2305bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//    public int getWeekendTransition(int dayOfWeek) {
2306bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//        throw new UnsupportedOperationException("Method not supported by com.ibm.icu.base");
2307bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//    }
2308bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
2309bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /**
2310bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * {@icu} Returns true if the given date and time is in the weekend in this calendar
2311bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * system.  Equivalent to calling setTime() followed by isWeekend().  Note: This
2312bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * method changes the time this calendar is set to.
2313bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @param date the date and time
2314bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @return true if the given date and time is part of the
2315bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * weekend
2316bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @see #getDayOfWeekType
2317bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @see #getWeekendTransition
2318bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @see #isWeekend()
2319bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @stable ICU 2.0
2320bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     */
2321bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public boolean isWeekend(Date date) {
2322bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        calendar.setTime(date);
2323bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        return isWeekend();
2324bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    }
2325bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
2326bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /**
2327bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * {@icu} Returns true if this Calendar's current date and time is in the weekend in
2328bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * this calendar system.
2329bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @return true if the given date and time is part of the
2330bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * weekend
2331bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @see #getDayOfWeekType
2332bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @see #getWeekendTransition
2333bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @see #isWeekend(Date)
2334bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @stable ICU 2.0
2335bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     */
2336bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public boolean isWeekend() {
2337bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        // weekend always full saturday and sunday with com.ibm.icu.base
2338bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        int dow = calendar.get(Calendar.DAY_OF_WEEK);
2339bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        if (dow == SATURDAY || dow == SUNDAY) {
2340bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            return true;
2341bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        }
2342bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        return false;
2343bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    }
2344bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
2345bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    //-------------------------------------------------------------------------
2346bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    // End of weekend support
2347bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    //-------------------------------------------------------------------------
2348bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
2349bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /**
2350bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * Overrides Cloneable
2351bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @stable ICU 2.0
2352bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     */
2353bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public Object clone()
2354bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    {
2355bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        return new Calendar((java.util.Calendar)calendar.clone());
2356bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    }
2357bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
2358bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /**
2359bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * Returns a string representation of this calendar. This method
2360bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * is intended to be used only for debugging purposes, and the
2361bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * format of the returned string may vary between implementations.
2362bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * The returned string may be empty but may not be <code>null</code>.
2363bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     *
2364bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @return  a string representation of this calendar.
2365bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @stable ICU 2.0
2366bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     */
2367bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public String toString() {
2368bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        return calendar.toString();
2369bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    }
2370bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
2371bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /**
2372bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * {@icu} Returns the number of fields defined by this calendar.  Valid field
2373bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * arguments to <code>set()</code> and <code>get()</code> are
2374bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * <code>0..getFieldCount()-1</code>.
2375bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @stable ICU 2.0
2376bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     */
2377bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public final int getFieldCount() {
2378bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        return FIELD_COUNT;
2379bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    }
2380bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
2381bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    private static final int FIELD_COUNT = /* IS_LEAP_MONTH */ DST_OFFSET + 1;
2382bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
2383bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /**
2384bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * {@icu} Returns the current Calendar type.  Note, in 3.0 this function will return
2385bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * 'gregorian' in Calendar to emulate legacy behavior
2386bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @return type of calendar (gregorian, etc)
2387bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @stable ICU 3.8
2388bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     */
2389bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public String getType() {
2390bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        // JDK supports Gregorian, Japanese and Buddhist
2391bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        String name = calendar.getClass().getSimpleName().toLowerCase(Locale.US);
2392bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        if (name.contains("japanese")) {
2393bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            return "japanese";
2394bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        } else if (name.contains("buddhist")) {
2395bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            return "buddhist";
2396bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        }
2397bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        return "gregorian";
2398bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    }
2399bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
2400bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    // -------- BEGIN ULocale boilerplate --------
2401bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
2402bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//    /**
2403bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * {@icu} Returns the locale that was used to create this object, or null.
2404bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * This may may differ from the locale requested at the time of
2405bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * this object's creation.  For example, if an object is created
2406bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * for locale <tt>en_US_CALIFORNIA</tt>, the actual data may be
2407bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * drawn from <tt>en</tt> (the <i>actual</i> locale), and
2408bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * <tt>en_US</tt> may be the most specific locale that exists (the
2409bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * <i>valid</i> locale).
2410bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     *
2411bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * <p>Note: This method will be implemented in ICU 3.0; ICU 2.8
2412bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * contains a partial preview implementation.  The * <i>actual</i>
2413bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * locale is returned correctly, but the <i>valid</i> locale is
2414bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * not, in most cases.
2415bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * @param type type of information requested, either {@link
2416bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * com.ibm.icu.util.ULocale#VALID_LOCALE} or {@link
2417bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * com.ibm.icu.util.ULocale#ACTUAL_LOCALE}.
2418bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * @return the information specified by <i>type</i>, or null if
2419bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * this object was not constructed from locale data.
2420bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * @see com.ibm.icu.util.ULocale
2421bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * @see com.ibm.icu.util.ULocale#VALID_LOCALE
2422bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * @see com.ibm.icu.util.ULocale#ACTUAL_LOCALE
2423bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * @draft ICU 2.8 (retain)
2424bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * @provisional This API might change or be removed in a future release.
2425bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     */
2426bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//    public final ULocale getLocale(ULocale.Type type) {
2427bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//        throw new UnsupportedOperationException("Method not supported by com.ibm.icu.base");
2428bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//    }
2429bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
2430bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    // -------- END ULocale boilerplate --------
2431bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
2432bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
2433bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    private static int getJDKField(int icuField) {
2434bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        switch (icuField) {
2435bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        case ERA:
2436bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            return java.util.Calendar.ERA;
2437bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        case YEAR:
2438bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            return java.util.Calendar.YEAR;
2439bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        case MONTH:
2440bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            return java.util.Calendar.MONTH;
2441bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        case WEEK_OF_YEAR:
2442bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            return java.util.Calendar.WEEK_OF_YEAR;
2443bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        case WEEK_OF_MONTH:
2444bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            return java.util.Calendar.WEEK_OF_MONTH;
2445bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        case DATE:
2446bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            return java.util.Calendar.DATE;
2447bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//        case DAY_OF_MONTH:
2448bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//            return java.util.Calendar.DAY_OF_MONTH;
2449bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        case DAY_OF_YEAR:
2450bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            return java.util.Calendar.DAY_OF_YEAR;
2451bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        case DAY_OF_WEEK:
2452bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            return java.util.Calendar.DAY_OF_WEEK;
2453bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        case DAY_OF_WEEK_IN_MONTH:
2454bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            return java.util.Calendar.DAY_OF_WEEK_IN_MONTH;
2455bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        case AM_PM:
2456bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            return java.util.Calendar.AM_PM;
2457bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        case HOUR:
2458bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            return java.util.Calendar.HOUR;
2459bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        case HOUR_OF_DAY:
2460bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            return java.util.Calendar.HOUR_OF_DAY;
2461bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        case MINUTE:
2462bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            return java.util.Calendar.MINUTE;
2463bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        case SECOND:
2464bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            return java.util.Calendar.SECOND;
2465bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        case MILLISECOND:
2466bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            return java.util.Calendar.MILLISECOND;
2467bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        case ZONE_OFFSET:
2468bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            return java.util.Calendar.ZONE_OFFSET;
2469bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        case DST_OFFSET:
2470bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            return java.util.Calendar.DST_OFFSET;
2471bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
2472bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//        case YEAR_WOY:
2473bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//        case DOW_LOCAL:
2474bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//        case EXTENDED_YEAR:
2475bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//        case JULIAN_DAY:
2476bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//        case MILLISECONDS_IN_DAY:
2477bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//            // Unmappable
2478bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//            throw new UnsupportedOperationException("Calendar field type not supported by com.ibm.icu.base");
2479bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        default:
2480bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            // Illegal
2481bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            throw new ArrayIndexOutOfBoundsException("Specified calendar field is out of range");
2482bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        }
2483bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    }
2484bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert}
2485