1adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/*
2adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  Licensed to the Apache Software Foundation (ASF) under one or more
3adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  contributor license agreements.  See the NOTICE file distributed with
4adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  this work for additional information regarding copyright ownership.
5adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  The ASF licenses this file to You under the Apache License, Version 2.0
6adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  (the "License"); you may not use this file except in compliance with
7adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  the License.  You may obtain a copy of the License at
8adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
9adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *     http://www.apache.org/licenses/LICENSE-2.0
10adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
11adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  Unless required by applicable law or agreed to in writing, software
12adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  distributed under the License is distributed on an "AS IS" BASIS,
13adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  See the License for the specific language governing permissions and
15adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  limitations under the License.
16adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */
17adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
18adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpackage java.util;
19adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
20adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.IOException;
21adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.ObjectInputStream;
22adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.ObjectOutputStream;
23adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.ObjectStreamField;
24adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.Serializable;
252e43b95339579a2ea8b749d7598677bb44f2770fElliott Hughesimport java.text.DateFormatSymbols;
26162b0775772fa66b7eb634760a8159a60c1ddceaElliott Hughesimport libcore.icu.ICU;
27162b0775772fa66b7eb634760a8159a60c1ddceaElliott Hughesimport libcore.icu.LocaleData;
2833aa6eb602478e7f51ac16f30c88db3566022886Elliott Hughes
29adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/**
30adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code Calendar} is an abstract base class for converting between a
31adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code Date} object and a set of integer fields such as
32adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code YEAR}, {@code MONTH}, {@code DAY},
33adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code HOUR}, and so on. (A {@code Date} object represents a
34adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * specific instant in time with millisecond precision. See {@link Date} for
35adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * information about the {@code Date} class.)
36f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson *
37adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>
38adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Subclasses of {@code Calendar} interpret a {@code Date}
39adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * according to the rules of a specific calendar system.
40f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson *
41adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>
42adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Like other locale-sensitive classes, {@code Calendar} provides a class
43adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * method, {@code getInstance}, for getting a default instance of
44adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * this class for general use. {@code Calendar}'s {@code getInstance} method
45adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * returns a calendar whose locale is based on system settings and whose time fields
46adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * have been initialized with the current date and time: <blockquote>
47f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson *
48adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <pre>Calendar rightNow = Calendar.getInstance()</pre>
49f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson *
50adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </blockquote>
51f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson *
52adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>
53adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * A {@code Calendar} object can produce all the time field values needed
54adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * to implement the date-time formatting for a particular language and calendar
55adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * style (for example, Japanese-Gregorian, Japanese-Traditional).
56adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code Calendar} defines the range of values returned by certain
57adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * fields, as well as their meaning. For example, the first month of the year
58adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * has value {@code MONTH} == {@code JANUARY} for all calendars.
59adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Other values are defined by the concrete subclass, such as {@code ERA}
60adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * and {@code YEAR}. See individual field documentation and subclass
61adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * documentation for details.
62f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson *
63adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>
64adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * When a {@code Calendar} is <em>lenient</em>, it accepts a wider
65adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * range of field values than it produces. For example, a lenient
66adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code GregorianCalendar} interprets {@code MONTH} ==
67adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code JANUARY}, {@code DAY_OF_MONTH} == 32 as February 1. A
68adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * non-lenient {@code GregorianCalendar} throws an exception when given
69adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * out-of-range field settings. When calendars recompute field values for return
70adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * by {@code get()}, they normalize them. For example, a
71adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code GregorianCalendar} always produces {@code DAY_OF_MONTH}
72adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * values between 1 and the length of the month.
73f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson *
74adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>
75adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code Calendar} defines a locale-specific seven day week using two
76adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * parameters: the first day of the week and the minimal days in first week
77adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * (from 1 to 7). These numbers are taken from the locale resource data when a
78adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code Calendar} is constructed. They may also be specified explicitly
79adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * through the API.
80f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson *
81adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>
82adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * When setting or getting the {@code WEEK_OF_MONTH} or
83adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code WEEK_OF_YEAR} fields, {@code Calendar} must determine
84adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the first week of the month or year as a reference point. The first week of a
85adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * month or year is defined as the earliest seven day period beginning on
86adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code getFirstDayOfWeek()} and containing at least
87adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code getMinimalDaysInFirstWeek()} days of that month or year. Weeks
88adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * numbered ..., -1, 0 precede the first week; weeks numbered 2, 3,... follow
89adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * it. Note that the normalized numbering returned by {@code get()} may
90adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * be different. For example, a specific {@code Calendar} subclass may
91adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * designate the week before week 1 of a year as week <em>n</em> of the
92adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * previous year.
93f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson *
94adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>
95adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * When computing a {@code Date} from time fields, two special
96adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * circumstances may arise: there may be insufficient information to compute the
97adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code Date} (such as only year and month but no day in the month), or
98adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * there may be inconsistent information (such as "Tuesday, July 15, 1996" --
99adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * July 15, 1996 is actually a Monday).
100f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson *
101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>
102adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <strong>Insufficient information.</strong> The calendar will use default
103adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * information to specify the missing fields. This may vary by calendar; for the
104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Gregorian calendar, the default for a field is the same as that of the start
105adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * of the epoch: i.e., YEAR = 1970, MONTH = JANUARY, DATE = 1, etc.
106f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson *
107adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>
108adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <strong>Inconsistent information.</strong> If fields conflict, the calendar
109adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * will give preference to fields set more recently. For example, when
110adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * determining the day, the calendar will look for one of the following
111adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * combinations of fields. The most recent combination, as determined by the
112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * most recently set single field, will be used.
113f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson *
114adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <blockquote>
115f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson *
116adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <pre>
117adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * MONTH + DAY_OF_MONTH
118adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * MONTH + WEEK_OF_MONTH + DAY_OF_WEEK
119adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * MONTH + DAY_OF_WEEK_IN_MONTH + DAY_OF_WEEK
120adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * DAY_OF_YEAR
121adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * DAY_OF_WEEK + WEEK_OF_YEAR</pre>
122f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson *
123adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </blockquote>
124f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson *
125adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * For the time of day:
126f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson *
127adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <blockquote>
128f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson *
129adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <pre>
130adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * HOUR_OF_DAY
131adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * AM_PM + HOUR</pre>
132f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson *
133adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </blockquote>
134f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson *
135adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>
136adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <strong>Note:</strong> There are certain possible ambiguities in
137adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * interpretation of certain singular times, which are resolved in the following
138adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * ways:
139adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <ol>
140adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li> 24:00:00 "belongs" to the following day. That is, 23:59 on Dec 31, 1969
141f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * &lt; 24:00 on Jan 1, 1970 &lt; 24:01:00 on Jan 1, 1970 form a sequence of
142f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * three consecutive minutes in time.
143f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson *
144adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li> Although historically not precise, midnight also belongs to "am", and
145adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * noon belongs to "pm", so on the same day, we have 12:00 am (midnight) &lt; 12:01 am,
146adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * and 12:00 pm (noon) &lt; 12:01 pm
147adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </ol>
148f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson *
149adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>
150adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The date or time format strings are not part of the definition of a calendar,
151adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * as those must be modifiable or overridable by the user at runtime. Use
152adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@link java.text.DateFormat} to format dates.
153f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson *
154adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>
155adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <strong>Field manipulation methods</strong>
156f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson *
157adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>
158adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code Calendar} fields can be changed using three methods:
159adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code set()}, {@code add()}, and {@code roll()}.
160f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson *
161adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>
162adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <strong>{@code set(f, value)}</strong> changes field {@code f}
163adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * to {@code value}. In addition, it sets an internal member variable to
164adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * indicate that field {@code f} has been changed. Although field
165adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code f} is changed immediately, the calendar's milliseconds is not
166adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * recomputed until the next call to {@code get()},
167adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code getTime()}, or {@code getTimeInMillis()} is made. Thus,
168adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * multiple calls to {@code set()} do not trigger multiple, unnecessary
169adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * computations. As a result of changing a field using {@code set()},
170adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * other fields may also change, depending on the field, the field value, and
171adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the calendar system. In addition, {@code get(f)} will not necessarily
172adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * return {@code value} after the fields have been recomputed. The
173adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * specifics are determined by the concrete calendar class.
174f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson *
175adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>
176adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <em>Example</em>: Consider a {@code GregorianCalendar} originally
177adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * set to August 31, 1999. Calling <code>set(Calendar.MONTH,
178adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Calendar.SEPTEMBER)</code>
179adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * sets the calendar to September 31, 1999. This is a temporary internal
180adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * representation that resolves to October 1, 1999 if {@code getTime()}is
181adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * then called. However, a call to {@code set(Calendar.DAY_OF_MONTH, 30)}
182adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * before the call to {@code getTime()} sets the calendar to September
183adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 30, 1999, since no recomputation occurs after {@code set()} itself.
184f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson *
185adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>
186adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <strong>{@code add(f, delta)}</strong> adds {@code delta} to
187adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * field {@code f}. This is equivalent to calling <code>set(f,
188adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * get(f) + delta)</code>
189adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * with two adjustments:
190f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson *
191adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <blockquote>
192adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>
193adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <strong>Add rule 1</strong>. The value of field {@code f} after the
194adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * call minus the value of field {@code f} before the call is
195adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code delta}, modulo any overflow that has occurred in field
196adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code f}. Overflow occurs when a field value exceeds its range and,
197adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * as a result, the next larger field is incremented or decremented and the
198adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * field value is adjusted back into its range.
199f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson *
200adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>
201adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <strong>Add rule 2</strong>. If a smaller field is expected to be invariant,
202adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * but &nbsp; it is impossible for it to be equal to its prior value because of
203adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * changes in its minimum or maximum after field {@code f} is changed,
204adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * then its value is adjusted to be as close as possible to its expected value.
205adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * A smaller field represents a smaller unit of time. {@code HOUR} is a
206adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * smaller field than {@code DAY_OF_MONTH}. No adjustment is made to
207adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * smaller fields that are not expected to be invariant. The calendar system
208adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * determines what fields are expected to be invariant.
209adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </blockquote>
210f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson *
211adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>
212adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * In addition, unlike {@code set()}, {@code add()} forces an
213adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * immediate recomputation of the calendar's milliseconds and all fields.
214f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson *
215adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>
216adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <em>Example</em>: Consider a {@code GregorianCalendar} originally
217adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * set to August 31, 1999. Calling {@code add(Calendar.MONTH, 13)} sets
218adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the calendar to September 30, 2000. <strong>Add rule 1</strong> sets the
219adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code MONTH} field to September, since adding 13 months to August
220adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * gives September of the next year. Since {@code DAY_OF_MONTH} cannot be
221adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 31 in September in a {@code GregorianCalendar}, <strong>add rule 2</strong>
222adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * sets the {@code DAY_OF_MONTH} to 30, the closest possible value.
223adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Although it is a smaller field, {@code DAY_OF_WEEK} is not adjusted by
224adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * rule 2, since it is expected to change when the month changes in a
225adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code GregorianCalendar}.
226f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson *
227adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>
228adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <strong>{@code roll(f, delta)}</strong> adds {@code delta} to
229adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * field {@code f} without changing larger fields. This is equivalent to
230adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * calling {@code add(f, delta)} with the following adjustment:
231f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson *
232adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <blockquote>
233adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>
234adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <strong>Roll rule</strong>. Larger fields are unchanged after the call. A
235adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * larger field represents a larger unit of time. {@code DAY_OF_MONTH} is
236adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * a larger field than {@code HOUR}.
237adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </blockquote>
238f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson *
239adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>
240adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <em>Example</em>: Consider a {@code GregorianCalendar} originally
241adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * set to August 31, 1999. Calling <code>roll(Calendar.MONTH,
242adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 8)</code> sets
243adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the calendar to April 30, <strong>1999</strong>. Add rule 1 sets the
244adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code MONTH} field to April. Using a {@code GregorianCalendar},
245adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the {@code DAY_OF_MONTH} cannot be 31 in the month April. Add rule 2
246adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * sets it to the closest possible value, 30. Finally, the <strong>roll rule</strong>
247adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * maintains the {@code YEAR} field value of 1999.
248f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson *
249adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>
250adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <em>Example</em>: Consider a {@code GregorianCalendar} originally
251adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * set to Sunday June 6, 1999. Calling
252adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code roll(Calendar.WEEK_OF_MONTH, -1)} sets the calendar to Tuesday
253adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * June 1, 1999, whereas calling {@code add(Calendar.WEEK_OF_MONTH, -1)}
254adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * sets the calendar to Sunday May 30, 1999. This is because the roll rule
255adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * imposes an additional constraint: The {@code MONTH} must not change
256adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * when the {@code WEEK_OF_MONTH} is rolled. Taken together with add rule
257adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 1, the resultant date must be between Tuesday June 1 and Saturday June 5.
258adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * According to add rule 2, the {@code DAY_OF_WEEK}, an invariant when
259adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * changing the {@code WEEK_OF_MONTH}, is set to Tuesday, the closest
260adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * possible value to Sunday (where Sunday is the first day of the week).
261f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson *
262adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>
263adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <strong>Usage model</strong>. To motivate the behavior of {@code add()}
264adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * and {@code roll()}, consider a user interface component with
265adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * increment and decrement buttons for the month, day, and year, and an
266adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * underlying {@code GregorianCalendar}. If the interface reads January
267adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 31, 1999 and the user presses the month increment button, what should it
268adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * read? If the underlying implementation uses {@code set()}, it might
269adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * read March 3, 1999. A better result would be February 28, 1999. Furthermore,
270adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if the user presses the month increment button again, it should read March
271adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 31, 1999, not March 28, 1999. By saving the original date and using either
272adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code add()} or {@code roll()}, depending on whether larger
273adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * fields should be affected, the user interface can behave as most users will
274adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * intuitively expect.
275f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson *
276adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>
277adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <b>Note:</b> You should always use {@code roll} and {@code add} rather than
278adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * attempting to perform arithmetic operations directly on the fields of a
279adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <tt>Calendar</tt>. It is quite possible for <tt>Calendar</tt> subclasses
280adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * to have fields with non-linear behavior, for example missing months or days
281adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * during non-leap years. The subclasses' <tt>add</tt> and <tt>roll</tt>
282adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * methods will take this into account, while simple arithmetic manipulations
283adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * may give invalid results.
284f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson *
285adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see Date
286adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see GregorianCalendar
287adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see TimeZone
288adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */
28969bcb487b7317dde579a8ddc1a8094040ed7ae2bElliott Hughespublic abstract class Calendar implements Serializable, Cloneable, Comparable<Calendar> {
290adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
291adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private static final long serialVersionUID = -1807547505821590642L;
292adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
293adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
29469bcb487b7317dde579a8ddc1a8094040ed7ae2bElliott Hughes     * True iff the values in {@code fields[]} correspond to {@code time}. Despite the name, this
29569bcb487b7317dde579a8ddc1a8094040ed7ae2bElliott Hughes     * is effectively "are the values in fields[] up-to-date?" --- {@code fields[]} may contain
29669bcb487b7317dde579a8ddc1a8094040ed7ae2bElliott Hughes     * non-zero values and {@code isSet[]} may contain {@code true} values even when
29769bcb487b7317dde579a8ddc1a8094040ed7ae2bElliott Hughes     * {@code areFieldsSet} is false.
29869bcb487b7317dde579a8ddc1a8094040ed7ae2bElliott Hughes     * Accessing the fields via {@code get} will ensure the fields are up-to-date.
299adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
300adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    protected boolean areFieldsSet;
301adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
302adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
30369bcb487b7317dde579a8ddc1a8094040ed7ae2bElliott Hughes     * Contains broken-down field values for the current value of {@code time} if
30469bcb487b7317dde579a8ddc1a8094040ed7ae2bElliott Hughes     * {@code areFieldsSet} is true, or stale data corresponding to some previous value otherwise.
30569bcb487b7317dde579a8ddc1a8094040ed7ae2bElliott Hughes     * Accessing the fields via {@code get} will ensure the fields are up-to-date.
30669bcb487b7317dde579a8ddc1a8094040ed7ae2bElliott Hughes     * The array length is always {@code FIELD_COUNT}.
307adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
308adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    protected int[] fields;
309adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
310adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
31169bcb487b7317dde579a8ddc1a8094040ed7ae2bElliott Hughes     * Whether the corresponding element in {@code field[]} has been set. Initially, these are all
31269bcb487b7317dde579a8ddc1a8094040ed7ae2bElliott Hughes     * false. The first time the fields are computed, these are set to true and remain set even if
31369bcb487b7317dde579a8ddc1a8094040ed7ae2bElliott Hughes     * the data becomes stale: you <i>must</i> check {@code areFieldsSet} if you want to know
31469bcb487b7317dde579a8ddc1a8094040ed7ae2bElliott Hughes     * whether the value is up-to-date.
31569bcb487b7317dde579a8ddc1a8094040ed7ae2bElliott Hughes     * Note that {@code isSet} is <i>not</i> a safe alternative to accessing this array directly,
31669bcb487b7317dde579a8ddc1a8094040ed7ae2bElliott Hughes     * and will likewise return stale data!
31769bcb487b7317dde579a8ddc1a8094040ed7ae2bElliott Hughes     * The array length is always {@code FIELD_COUNT}.
318adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
319adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    protected boolean[] isSet;
320adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
321adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
32269bcb487b7317dde579a8ddc1a8094040ed7ae2bElliott Hughes     * Whether {@code time} corresponds to the values in {@code fields[]}. If false, {@code time}
32369bcb487b7317dde579a8ddc1a8094040ed7ae2bElliott Hughes     * is out-of-date with respect to changes {@code fields[]}.
32469bcb487b7317dde579a8ddc1a8094040ed7ae2bElliott Hughes     * Accessing the time via {@code getTimeInMillis} will always return the correct value.
325adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
326adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    protected boolean isTimeSet;
327adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
328adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
32969bcb487b7317dde579a8ddc1a8094040ed7ae2bElliott Hughes     * A time in milliseconds since January 1, 1970. See {@code isTimeSet}.
33069bcb487b7317dde579a8ddc1a8094040ed7ae2bElliott Hughes     * Accessing the time via {@code getTimeInMillis} will always return the correct value.
331adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
332adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    protected long time;
333adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
334adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    transient int lastTimeFieldSet;
335adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
336adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    transient int lastDateFieldSet;
337adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
338adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private boolean lenient;
339adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
340adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private int firstDayOfWeek;
341adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
342adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private int minimalDaysInFirstWeek;
343adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
344adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private TimeZone zone;
345adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
346adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
347adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Value of the {@code MONTH} field indicating the first month of the
348adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * year.
349adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
350adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static final int JANUARY = 0;
351adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
352adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
353adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Value of the {@code MONTH} field indicating the second month of
354adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * the year.
355adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
356adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static final int FEBRUARY = 1;
357adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
358adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
359adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Value of the {@code MONTH} field indicating the third month of the
360adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * year.
361adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
362adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static final int MARCH = 2;
363adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
364adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
365adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Value of the {@code MONTH} field indicating the fourth month of
366adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * the year.
367adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
368adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static final int APRIL = 3;
369adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
370adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
371adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Value of the {@code MONTH} field indicating the fifth month of the
372adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * year.
373adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
374adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static final int MAY = 4;
375adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
376adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
377adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Value of the {@code MONTH} field indicating the sixth month of the
378adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * year.
379adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
380adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static final int JUNE = 5;
381adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
382adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
383adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Value of the {@code MONTH} field indicating the seventh month of
384adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * the year.
385adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
386adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static final int JULY = 6;
387adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
388adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
389adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Value of the {@code MONTH} field indicating the eighth month of
390adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * the year.
391adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
392adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static final int AUGUST = 7;
393adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
394adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
395adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Value of the {@code MONTH} field indicating the ninth month of the
396adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * year.
397adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
398adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static final int SEPTEMBER = 8;
399adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
400adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
401adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Value of the {@code MONTH} field indicating the tenth month of the
402adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * year.
403adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
404adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static final int OCTOBER = 9;
405adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
406adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
407adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Value of the {@code MONTH} field indicating the eleventh month of
408adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * the year.
409adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
410adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static final int NOVEMBER = 10;
411adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
412adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
413adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Value of the {@code MONTH} field indicating the twelfth month of
414adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * the year.
415adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
416adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static final int DECEMBER = 11;
417adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
418adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
419adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Value of the {@code MONTH} field indicating the thirteenth month
420adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * of the year. Although {@code GregorianCalendar} does not use this
421adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * value, lunar calendars do.
422adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
423adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static final int UNDECIMBER = 12;
424adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
425adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
426adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Value of the {@code DAY_OF_WEEK} field indicating Sunday.
427adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
428adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static final int SUNDAY = 1;
429adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
430adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
431adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Value of the {@code DAY_OF_WEEK} field indicating Monday.
432adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
433adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static final int MONDAY = 2;
434adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
435adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
436adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Value of the {@code DAY_OF_WEEK} field indicating Tuesday.
437adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
438adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static final int TUESDAY = 3;
439adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
440adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
441adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Value of the {@code DAY_OF_WEEK} field indicating Wednesday.
442adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
443adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static final int WEDNESDAY = 4;
444adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
445adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
446adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Value of the {@code DAY_OF_WEEK} field indicating Thursday.
447adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
448adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static final int THURSDAY = 5;
449adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
450adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
451adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Value of the {@code DAY_OF_WEEK} field indicating Friday.
452adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
453adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static final int FRIDAY = 6;
454adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
455adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
456adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Value of the {@code DAY_OF_WEEK} field indicating Saturday.
457adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
458adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static final int SATURDAY = 7;
459adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
460adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
461adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Field number for {@code get} and {@code set} indicating the
462adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * era, e.g., AD or BC in the Julian calendar. This is a calendar-specific
463adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * value; see subclass documentation.
464f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
465adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see GregorianCalendar#AD
466adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see GregorianCalendar#BC
467adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
468adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static final int ERA = 0;
469adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
470adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
471adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Field number for {@code get} and {@code set} indicating the
472adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * year. This is a calendar-specific value; see subclass documentation.
473adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
474adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static final int YEAR = 1;
475adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
476adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
477adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Field number for {@code get} and {@code set} indicating the
478adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * month. This is a calendar-specific value. The first month of the year is
479adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code JANUARY}; the last depends on the number of months in a
480adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * year.
481f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
482adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see #JANUARY
483adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see #FEBRUARY
484adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see #MARCH
485adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see #APRIL
486adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see #MAY
487adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see #JUNE
488adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see #JULY
489adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see #AUGUST
490adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see #SEPTEMBER
491adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see #OCTOBER
492adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see #NOVEMBER
493adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see #DECEMBER
494adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see #UNDECIMBER
495adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
496adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static final int MONTH = 2;
497adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
498adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
499adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Field number for {@code get} and {@code set} indicating the
500adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * week number within the current year. The first week of the year, as
501adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * defined by {@code getFirstDayOfWeek()} and
502adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code getMinimalDaysInFirstWeek()}, has value 1. Subclasses
503adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * define the value of {@code WEEK_OF_YEAR} for days before the first
504adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * week of the year.
505f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
506adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see #getFirstDayOfWeek
507adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see #getMinimalDaysInFirstWeek
508adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
509adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static final int WEEK_OF_YEAR = 3;
510adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
511adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
512adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Field number for {@code get} and {@code set} indicating the
513adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * week number within the current month. The first week of the month, as
514adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * defined by {@code getFirstDayOfWeek()} and
515adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code getMinimalDaysInFirstWeek()}, has value 1. Subclasses
516adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * define the value of {@code WEEK_OF_MONTH} for days before the
517adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * first week of the month.
518f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
519adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see #getFirstDayOfWeek
520adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see #getMinimalDaysInFirstWeek
521adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
522adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static final int WEEK_OF_MONTH = 4;
523adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
524adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
525adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Field number for {@code get} and {@code set} indicating the
526adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * day of the month. This is a synonym for {@code DAY_OF_MONTH}. The
527adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * first day of the month has value 1.
528f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
529adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see #DAY_OF_MONTH
530adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
531adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static final int DATE = 5;
532adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
533adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
534adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Field number for {@code get} and {@code set} indicating the
535adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * day of the month. This is a synonym for {@code DATE}. The first
536adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * day of the month has value 1.
537f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
538adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see #DATE
539adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
540adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static final int DAY_OF_MONTH = 5;
541adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
542adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
543adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Field number for {@code get} and {@code set} indicating the
544adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * day number within the current year. The first day of the year has value
545adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * 1.
546adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
547adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static final int DAY_OF_YEAR = 6;
548adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
549adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
550adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Field number for {@code get} and {@code set} indicating the
551adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * day of the week. This field takes values {@code SUNDAY},
552adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code MONDAY}, {@code TUESDAY}, {@code WEDNESDAY},
553adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code THURSDAY}, {@code FRIDAY}, and
554adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code SATURDAY}.
555f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
556adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see #SUNDAY
557adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see #MONDAY
558adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see #TUESDAY
559adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see #WEDNESDAY
560adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see #THURSDAY
561adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see #FRIDAY
562adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see #SATURDAY
563adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
564adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static final int DAY_OF_WEEK = 7;
565adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
566adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
567adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Field number for {@code get} and {@code set} indicating the
568adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * ordinal number of the day of the week within the current month. Together
569adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * with the {@code DAY_OF_WEEK} field, this uniquely specifies a day
570adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * within a month. Unlike {@code WEEK_OF_MONTH} and
571adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code WEEK_OF_YEAR}, this field's value does <em>not</em>
572adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * depend on {@code getFirstDayOfWeek()} or
573adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code getMinimalDaysInFirstWeek()}. {@code DAY_OF_MONTH 1}
574adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * through {@code 7} always correspond to <code>DAY_OF_WEEK_IN_MONTH
575adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * 1</code>;
576adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code 8} through {@code 15} correspond to
577adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code DAY_OF_WEEK_IN_MONTH 2}, and so on.
578adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code DAY_OF_WEEK_IN_MONTH 0} indicates the week before
579adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code DAY_OF_WEEK_IN_MONTH 1}. Negative values count back from
580adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * the end of the month, so the last Sunday of a month is specified as
581adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code DAY_OF_WEEK = SUNDAY, DAY_OF_WEEK_IN_MONTH = -1}. Because
582adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * negative values count backward they will usually be aligned differently
583adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * within the month than positive values. For example, if a month has 31
584adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * days, {@code DAY_OF_WEEK_IN_MONTH -1} will overlap
585adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code DAY_OF_WEEK_IN_MONTH 5} and the end of {@code 4}.
586f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
587adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see #DAY_OF_WEEK
588adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see #WEEK_OF_MONTH
589adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
590adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static final int DAY_OF_WEEK_IN_MONTH = 8;
591adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
592adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
593adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Field number for {@code get} and {@code set} indicating
594adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * whether the {@code HOUR} is before or after noon. E.g., at
595adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * 10:04:15.250 PM the {@code AM_PM} is {@code PM}.
596f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
597adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see #AM
598adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see #PM
599adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see #HOUR
600adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
601adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static final int AM_PM = 9;
602adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
603adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
604adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Field number for {@code get} and {@code set} indicating the
605adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * hour of the morning or afternoon. {@code HOUR} is used for the
606adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * 12-hour clock. E.g., at 10:04:15.250 PM the {@code HOUR} is 10.
607f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
608adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see #AM_PM
609adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see #HOUR_OF_DAY
610adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
611adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static final int HOUR = 10;
612adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
613adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
614adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Field number for {@code get} and {@code set} indicating the
615adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * hour of the day. {@code HOUR_OF_DAY} is used for the 24-hour
616adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * clock. E.g., at 10:04:15.250 PM the {@code HOUR_OF_DAY} is 22.
617f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
618adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see #HOUR
619adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
620adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static final int HOUR_OF_DAY = 11;
621adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
622adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
623adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Field number for {@code get} and {@code set} indicating the
624adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * minute within the hour. E.g., at 10:04:15.250 PM the {@code MINUTE}
625adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * is 4.
626adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
627adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static final int MINUTE = 12;
628adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
629adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
630adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Field number for {@code get} and {@code set} indicating the
631adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * second within the minute. E.g., at 10:04:15.250 PM the
632adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code SECOND} is 15.
633adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
634adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static final int SECOND = 13;
635adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
636adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
637adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Field number for {@code get} and {@code set} indicating the
638adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * millisecond within the second. E.g., at 10:04:15.250 PM the
639adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code MILLISECOND} is 250.
640adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
641adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static final int MILLISECOND = 14;
642adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
643adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
644adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Field number for {@code get} and {@code set} indicating the
645fda7c027e360292edfa4d32fadd2844efaa5f9d7Elliott Hughes     * raw (non-DST) offset from GMT in milliseconds.
646fda7c027e360292edfa4d32fadd2844efaa5f9d7Elliott Hughes     * Equivalent to {@link java.util.TimeZone#getRawOffset}.
647fda7c027e360292edfa4d32fadd2844efaa5f9d7Elliott Hughes     *
648fda7c027e360292edfa4d32fadd2844efaa5f9d7Elliott Hughes     * <p>To determine the total offset from GMT at the time represented
649fda7c027e360292edfa4d32fadd2844efaa5f9d7Elliott Hughes     * by this calendar, you will need to add the {@code ZONE_OFFSET} and
650fda7c027e360292edfa4d32fadd2844efaa5f9d7Elliott Hughes     * {@code DST_OFFSET} fields.
651adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
652adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static final int ZONE_OFFSET = 15;
653adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
654adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
655adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Field number for {@code get} and {@code set} indicating the
656fda7c027e360292edfa4d32fadd2844efaa5f9d7Elliott Hughes     * daylight savings offset from the {@code ZONE_OFFSET} in milliseconds.
657fda7c027e360292edfa4d32fadd2844efaa5f9d7Elliott Hughes     * Equivalent to {@link java.util.TimeZone#getDSTSavings} if the represented time
658fda7c027e360292edfa4d32fadd2844efaa5f9d7Elliott Hughes     * falls inside DST, or 0 otherwise.
659fda7c027e360292edfa4d32fadd2844efaa5f9d7Elliott Hughes     *
660fda7c027e360292edfa4d32fadd2844efaa5f9d7Elliott Hughes     * <p>To determine the total offset from GMT at the time represented
661fda7c027e360292edfa4d32fadd2844efaa5f9d7Elliott Hughes     * by this calendar, you will need to add the {@code ZONE_OFFSET} and
662fda7c027e360292edfa4d32fadd2844efaa5f9d7Elliott Hughes     * {@code DST_OFFSET} fields.
663adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
664adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static final int DST_OFFSET = 16;
665adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
666adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
667adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * This is the total number of fields in this calendar.
668adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
669adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static final int FIELD_COUNT = 17;
670adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
671adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
672adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Value of the {@code AM_PM} field indicating the period of the day
673adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * from midnight to just before noon.
674adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
675adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static final int AM = 0;
676adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
677adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
678adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Value of the {@code AM_PM} field indicating the period of the day
679adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * from noon to just before midnight.
680adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
681adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static final int PM = 1;
682adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
6832e43b95339579a2ea8b749d7598677bb44f2770fElliott Hughes    /**
6842e43b95339579a2ea8b749d7598677bb44f2770fElliott Hughes     * Requests both {@code SHORT} and {@code LONG} styles in the map returned by
685bf87c56b39383f6b11c36c3cdc93df4b03fed914Brian Carlstrom     * {@link #getDisplayNames}.
6862e43b95339579a2ea8b749d7598677bb44f2770fElliott Hughes     * @since 1.6
6872e43b95339579a2ea8b749d7598677bb44f2770fElliott Hughes     */
6882e43b95339579a2ea8b749d7598677bb44f2770fElliott Hughes    public static final int ALL_STYLES = 0;
6892e43b95339579a2ea8b749d7598677bb44f2770fElliott Hughes
6902e43b95339579a2ea8b749d7598677bb44f2770fElliott Hughes    /**
6912e43b95339579a2ea8b749d7598677bb44f2770fElliott Hughes     * Requests short names (such as "Jan") from
692bf87c56b39383f6b11c36c3cdc93df4b03fed914Brian Carlstrom     * {@link #getDisplayName} or {@link #getDisplayNames}.
6932e43b95339579a2ea8b749d7598677bb44f2770fElliott Hughes     * @since 1.6
6942e43b95339579a2ea8b749d7598677bb44f2770fElliott Hughes     */
6952e43b95339579a2ea8b749d7598677bb44f2770fElliott Hughes    public static final int SHORT = 1;
6962e43b95339579a2ea8b749d7598677bb44f2770fElliott Hughes
6972e43b95339579a2ea8b749d7598677bb44f2770fElliott Hughes    /**
6982e43b95339579a2ea8b749d7598677bb44f2770fElliott Hughes     * Requests long names (such as "January") from
699bf87c56b39383f6b11c36c3cdc93df4b03fed914Brian Carlstrom     * {@link #getDisplayName} or {@link #getDisplayNames}.
7002e43b95339579a2ea8b749d7598677bb44f2770fElliott Hughes     * @since 1.6
7012e43b95339579a2ea8b749d7598677bb44f2770fElliott Hughes     */
7022e43b95339579a2ea8b749d7598677bb44f2770fElliott Hughes    public static final int LONG = 2;
7032e43b95339579a2ea8b749d7598677bb44f2770fElliott Hughes
7042e43b95339579a2ea8b749d7598677bb44f2770fElliott Hughes    private static final String[] FIELD_NAMES = { "ERA", "YEAR", "MONTH",
7052e43b95339579a2ea8b749d7598677bb44f2770fElliott Hughes            "WEEK_OF_YEAR", "WEEK_OF_MONTH", "DAY_OF_MONTH", "DAY_OF_YEAR",
7062e43b95339579a2ea8b749d7598677bb44f2770fElliott Hughes            "DAY_OF_WEEK", "DAY_OF_WEEK_IN_MONTH", "AM_PM", "HOUR",
7072e43b95339579a2ea8b749d7598677bb44f2770fElliott Hughes            "HOUR_OF_DAY", "MINUTE", "SECOND", "MILLISECOND",
7082e43b95339579a2ea8b749d7598677bb44f2770fElliott Hughes            "ZONE_OFFSET", "DST_OFFSET" };
709adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
710adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
711adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Constructs a {@code Calendar} instance using the default {@code TimeZone} and {@code Locale}.
712adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
713adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    protected Calendar() {
714adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        this(TimeZone.getDefault(), Locale.getDefault());
715adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
716adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
717adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    Calendar(TimeZone timezone) {
718adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        fields = new int[FIELD_COUNT];
719adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        isSet = new boolean[FIELD_COUNT];
720adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        areFieldsSet = isTimeSet = false;
721adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        setLenient(true);
722adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        setTimeZone(timezone);
723adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
724adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
725adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
726e040b50765cafb84783245ed959b1f5b6ded8de4Elliott Hughes     * Constructs a {@code Calendar} instance using the given {@code TimeZone} and {@code Locale}.
727adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
728adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    protected Calendar(TimeZone timezone, Locale locale) {
729adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        this(timezone);
730148de94b69ad9ed98ebb1adf0e8eb1b1e9e33e1fNarayan Kamath        locale = LocaleData.mapInvalidAndNullLocales(locale);
731757a7942eed2b0aa457f8517a0259d2ac82c5b18Elliott Hughes        LocaleData localeData = LocaleData.get(locale);
73233aa6eb602478e7f51ac16f30c88db3566022886Elliott Hughes        setFirstDayOfWeek(localeData.firstDayOfWeek.intValue());
73333aa6eb602478e7f51ac16f30c88db3566022886Elliott Hughes        setMinimalDaysInFirstWeek(localeData.minimalDaysInFirstWeek.intValue());
734adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
735adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
736f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson
737adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
738e040b50765cafb84783245ed959b1f5b6ded8de4Elliott Hughes     * Adds the given amount to a {@code Calendar} field.
739f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
740adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param field
741adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the {@code Calendar} field to modify.
742adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param value
743adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the amount to add to the field.
744f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * @throws IllegalArgumentException
745f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *                if {@code field} is {@code DST_OFFSET} or {@code
746f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *                ZONE_OFFSET}.
747adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
748d29fddcf333997fc2d7429d531e4d934dc705c88Jesse Wilson    public abstract void add(int field, int value);
749adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
750adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
751e040b50765cafb84783245ed959b1f5b6ded8de4Elliott Hughes     * Returns whether the {@code Date} represented by this {@code Calendar} instance is after the {@code Date}
752e040b50765cafb84783245ed959b1f5b6ded8de4Elliott Hughes     * represented by the parameter. The comparison is not dependent on the time
753adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * zones of the {@code Calendar}.
754f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
755adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param calendar
756adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the {@code Calendar} instance to compare.
757adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return {@code true} when this Calendar is after calendar, {@code false} otherwise.
758f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * @throws IllegalArgumentException
759f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *                if the time is not set and the time cannot be computed
760f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *                from the current field values.
761adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
762adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public boolean after(Object calendar) {
763adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (!(calendar instanceof Calendar)) {
764adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return false;
765adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
766adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return getTimeInMillis() > ((Calendar) calendar).getTimeInMillis();
767adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
768adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
769adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
770e040b50765cafb84783245ed959b1f5b6ded8de4Elliott Hughes     * Returns whether the {@code Date} represented by this {@code Calendar} instance is before the
771e040b50765cafb84783245ed959b1f5b6ded8de4Elliott Hughes     * {@code Date} represented by the parameter. The comparison is not dependent on the
772adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * time zones of the {@code Calendar}.
773f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
774adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param calendar
775adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the {@code Calendar} instance to compare.
776adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return {@code true} when this Calendar is before calendar, {@code false} otherwise.
777f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * @throws IllegalArgumentException
778f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *                if the time is not set and the time cannot be computed
779f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *                from the current field values.
780adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
781adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public boolean before(Object calendar) {
782adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (!(calendar instanceof Calendar)) {
783adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return false;
784adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
785adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return getTimeInMillis() < ((Calendar) calendar).getTimeInMillis();
786adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
787adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
788adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
789afc18db553293a12f7a04bd04c7d028dbb3de2f6Elliott Hughes     * Clears the values of all the time fields, marking them all unset and assigning
790afc18db553293a12f7a04bd04c7d028dbb3de2f6Elliott Hughes     * them all a value of zero. The actual field values will be determined the next
791afc18db553293a12f7a04bd04c7d028dbb3de2f6Elliott Hughes     * time the fields are accessed.
792adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
793adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public final void clear() {
794adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        for (int i = 0; i < FIELD_COUNT; i++) {
795adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            fields[i] = 0;
796adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            isSet[i] = false;
797adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
798adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        areFieldsSet = isTimeSet = false;
799adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
800adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
801adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
802afc18db553293a12f7a04bd04c7d028dbb3de2f6Elliott Hughes     * Clears the value in the given time field, marking it unset and assigning
803afc18db553293a12f7a04bd04c7d028dbb3de2f6Elliott Hughes     * it a value of zero. The actual field value will be determined the next
804afc18db553293a12f7a04bd04c7d028dbb3de2f6Elliott Hughes     * time the field is accessed.
805adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
806adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public final void clear(int field) {
807adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        fields[field] = 0;
808adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        isSet[field] = false;
809adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        areFieldsSet = isTimeSet = false;
810adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
811adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
812adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
81377ef2926d20998349254632052228bd456f82ed4Narayan Kamath     * Returns a partially deep copy of this {@code Calendar}; all fields from
81477ef2926d20998349254632052228bd456f82ed4Narayan Kamath     * from the {@code Calendar} class are cloned (deep copy) but fields from
81577ef2926d20998349254632052228bd456f82ed4Narayan Kamath     * subclasses aren't (shallow copy).
816adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
817adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
818adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public Object clone() {
819adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
820adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            Calendar clone = (Calendar) super.clone();
821adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            clone.fields = fields.clone();
822adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            clone.isSet = isSet.clone();
823adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            clone.zone = (TimeZone) zone.clone();
824adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return clone;
825adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (CloneNotSupportedException e) {
826fb0ec0e650bf8be35acb0d47da0311a7c446aa33Elliott Hughes            throw new AssertionError(e);
827adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
828adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
829adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
830adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
831adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Computes the time from the fields if the time has not already been set.
832adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Computes the fields from the time if the fields are not already set.
833f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
834f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * @throws IllegalArgumentException
835f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *                if the time is not set and the time cannot be computed
836adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *                from the current field values.
837adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
838adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    protected void complete() {
839adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (!isTimeSet) {
840adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            computeTime();
841adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            isTimeSet = true;
842adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
843adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (!areFieldsSet) {
844adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            computeFields();
845adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            areFieldsSet = true;
846adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
847adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
848adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
849adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
850adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Computes the {@code Calendar} fields from {@code time}.
851adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
852adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    protected abstract void computeFields();
853adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
854adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
855adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Computes {@code time} from the Calendar fields.
856f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
857f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * @throws IllegalArgumentException
858f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *                if the time cannot be computed from the current field
859adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *                values.
860adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
861adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    protected abstract void computeTime();
862adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
863adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
864e040b50765cafb84783245ed959b1f5b6ded8de4Elliott Hughes     * Compares the given object to this {@code Calendar} and returns whether they are
865adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * equal. The object must be an instance of {@code Calendar} and have the same
866adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * properties.
867f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
868e040b50765cafb84783245ed959b1f5b6ded8de4Elliott Hughes     * @return {@code true} if the given object is equal to this {@code Calendar}, {@code false}
869adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         otherwise.
870adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
871adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
872adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public boolean equals(Object object) {
873adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (this == object) {
874adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return true;
875adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
876adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (!(object instanceof Calendar)) {
877adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return false;
878adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
879adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Calendar cal = (Calendar) object;
880adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return getTimeInMillis() == cal.getTimeInMillis()
881adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                && isLenient() == cal.isLenient()
882adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                && getFirstDayOfWeek() == cal.getFirstDayOfWeek()
8831baa4fcbfe3c22e5f06a4fee48f520162d23270fJesse Wilson                && getMinimalDaysInFirstWeek() == cal.getMinimalDaysInFirstWeek()
884adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                && getTimeZone().equals(cal.getTimeZone());
885adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
886adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
887adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
888e040b50765cafb84783245ed959b1f5b6ded8de4Elliott Hughes     * Returns the value of the given field after computing the field values by
889adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * calling {@code complete()} first.
890f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
891f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * @throws IllegalArgumentException
892f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *                if the fields are not set, the time is not set, and the
893adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *                time cannot be computed from the current field values.
894f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * @throws ArrayIndexOutOfBoundsException
895adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *                if the field is not inside the range of possible fields.
896adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *                The range is starting at 0 up to {@code FIELD_COUNT}.
897adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
898adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public int get(int field) {
899adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        complete();
900adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return fields[field];
901adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
902adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
903adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
904e040b50765cafb84783245ed959b1f5b6ded8de4Elliott Hughes     * Returns the maximum value of the given field for the current date.
9051baa4fcbfe3c22e5f06a4fee48f520162d23270fJesse Wilson     * For example, the maximum number of days in the current month.
906adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
907adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public int getActualMaximum(int field) {
908adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        int value, next;
909adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (getMaximum(field) == (next = getLeastMaximum(field))) {
910adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return next;
911adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
912adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        complete();
913adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        long orgTime = time;
914adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        set(field, next);
915adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        do {
916adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            value = next;
917adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            roll(field, true);
918adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            next = get(field);
919adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } while (next > value);
920adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        time = orgTime;
921adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        areFieldsSet = false;
922adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return value;
923adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
924adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
925adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
926e040b50765cafb84783245ed959b1f5b6ded8de4Elliott Hughes     * Returns the minimum value of the given field for the current date.
927adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
928adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public int getActualMinimum(int field) {
929adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        int value, next;
930adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (getMinimum(field) == (next = getGreatestMinimum(field))) {
931adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return next;
932adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
933adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        complete();
934adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        long orgTime = time;
935adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        set(field, next);
936adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        do {
937adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            value = next;
938adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            roll(field, false);
939adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            next = get(field);
940adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } while (next < value);
941adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        time = orgTime;
942adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        areFieldsSet = false;
943adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return value;
944adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
945adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
946adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
94793f0d794f264baeb7a90d02e58cae60305b3912aElliott Hughes     * Returns an array of locales for which custom {@code Calendar} instances
94893f0d794f264baeb7a90d02e58cae60305b3912aElliott Hughes     * are available.
949d2d7abef3e9b73a57cdf1f2afd678d7f48945679Elliott Hughes     * <p>Note that Android does not support user-supplied locale service providers.
950adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
951adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static synchronized Locale[] getAvailableLocales() {
952757a7942eed2b0aa457f8517a0259d2ac82c5b18Elliott Hughes        return ICU.getAvailableCalendarLocales();
953adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
954adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
955adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
956e040b50765cafb84783245ed959b1f5b6ded8de4Elliott Hughes     * Returns the first day of the week for this {@code Calendar}.
957adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
958adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public int getFirstDayOfWeek() {
959adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return firstDayOfWeek;
960adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
961adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
962adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
963e040b50765cafb84783245ed959b1f5b6ded8de4Elliott Hughes     * Returns the greatest minimum value of the given field. This is the
964adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * biggest value that {@code getActualMinimum} can return for any possible
965adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * time.
966adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
967d29fddcf333997fc2d7429d531e4d934dc705c88Jesse Wilson    public abstract int getGreatestMinimum(int field);
968adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
969adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
970adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Constructs a new instance of the {@code Calendar} subclass appropriate for the
971e040b50765cafb84783245ed959b1f5b6ded8de4Elliott Hughes     * default {@code Locale} and default {@code TimeZone}, set to the current date and time.
972adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
973adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static synchronized Calendar getInstance() {
974adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return new GregorianCalendar();
975adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
976adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
977adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
978adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Constructs a new instance of the {@code Calendar} subclass appropriate for the
979e040b50765cafb84783245ed959b1f5b6ded8de4Elliott Hughes     * given {@code Locale} and default {@code TimeZone}, set to the current date and time.
980adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
981adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static synchronized Calendar getInstance(Locale locale) {
982adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return new GregorianCalendar(locale);
983adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
984adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
985adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
986adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Constructs a new instance of the {@code Calendar} subclass appropriate for the
987e040b50765cafb84783245ed959b1f5b6ded8de4Elliott Hughes     * default {@code Locale} and given {@code TimeZone}, set to the current date and time.
988adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
989adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static synchronized Calendar getInstance(TimeZone timezone) {
990adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return new GregorianCalendar(timezone);
991adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
992adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
993adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
994adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Constructs a new instance of the {@code Calendar} subclass appropriate for the
995e040b50765cafb84783245ed959b1f5b6ded8de4Elliott Hughes     * given {@code Locale} and given {@code TimeZone}, set to the current date and time.
996adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
99732d2e33dabd6767913e275a62c456f8fe4e5131fElliott Hughes    public static synchronized Calendar getInstance(TimeZone timezone, Locale locale) {
998adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return new GregorianCalendar(timezone, locale);
999adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1000adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1001adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1002e040b50765cafb84783245ed959b1f5b6ded8de4Elliott Hughes     * Returns the smallest maximum value of the given field. This is the
1003adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * smallest value that {@code getActualMaximum()} can return for any
1004adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * possible time.
1005adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1006d29fddcf333997fc2d7429d531e4d934dc705c88Jesse Wilson    public abstract int getLeastMaximum(int field);
1007adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1008adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1009e040b50765cafb84783245ed959b1f5b6ded8de4Elliott Hughes     * Returns the greatest maximum value of the given field. This returns the
1010e040b50765cafb84783245ed959b1f5b6ded8de4Elliott Hughes     * biggest value that {@code get} can return for the given field.
1011adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1012d29fddcf333997fc2d7429d531e4d934dc705c88Jesse Wilson    public abstract int getMaximum(int field);
1013adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1014adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1015e040b50765cafb84783245ed959b1f5b6ded8de4Elliott Hughes     * Returns the minimal days in the first week of the year.
1016adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1017adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public int getMinimalDaysInFirstWeek() {
1018adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return minimalDaysInFirstWeek;
1019adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1020adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1021adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1022e040b50765cafb84783245ed959b1f5b6ded8de4Elliott Hughes     * Returns the smallest minimum value of the given field. this returns the
1023e040b50765cafb84783245ed959b1f5b6ded8de4Elliott Hughes     * smallest value that {@code get} can return for the given field.
1024adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1025d29fddcf333997fc2d7429d531e4d934dc705c88Jesse Wilson    public abstract int getMinimum(int field);
1026adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1027adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1028e040b50765cafb84783245ed959b1f5b6ded8de4Elliott Hughes     * Returns the time of this {@code Calendar} as a {@code Date} object.
1029f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
1030f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * @throws IllegalArgumentException
1031f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *                if the time is not set and the time cannot be computed
1032adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *                from the current field values.
1033adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1034adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public final Date getTime() {
1035adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return new Date(getTimeInMillis());
1036adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1037adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1038adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1039e040b50765cafb84783245ed959b1f5b6ded8de4Elliott Hughes     * Returns the time represented by this {@code Calendar}, recomputing the time from its
1040e040b50765cafb84783245ed959b1f5b6ded8de4Elliott Hughes     * fields if necessary.
1041f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
1042f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * @throws IllegalArgumentException
1043f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *                if the time is not set and the time cannot be computed
1044adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *                from the current field values.
1045adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1046adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public long getTimeInMillis() {
1047adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (!isTimeSet) {
1048adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            computeTime();
1049adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            isTimeSet = true;
1050adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
1051adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return time;
1052adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1053adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1054adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1055e040b50765cafb84783245ed959b1f5b6ded8de4Elliott Hughes     * Returns the time zone used by this {@code Calendar}.
1056adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1057adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public TimeZone getTimeZone() {
1058adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return zone;
1059adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1060adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1061adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
1062adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public int hashCode() {
1063adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return (isLenient() ? 1237 : 1231) + getFirstDayOfWeek()
1064adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                + getMinimalDaysInFirstWeek() + getTimeZone().hashCode();
1065adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1066adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1067adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1068e040b50765cafb84783245ed959b1f5b6ded8de4Elliott Hughes     * Returns the value of the given field without recomputing.
1069adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1070adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    protected final int internalGet(int field) {
1071adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return fields[field];
1072adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1073adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1074adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1075e040b50765cafb84783245ed959b1f5b6ded8de4Elliott Hughes     * Tests whether this {@code Calendar} accepts field values which are outside the valid
1076adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * range for the field.
1077adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1078adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public boolean isLenient() {
1079adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return lenient;
1080adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1081adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1082adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1083e040b50765cafb84783245ed959b1f5b6ded8de4Elliott Hughes     * Tests whether the given field is set. Note that the interpretation of "is set" is
108469bcb487b7317dde579a8ddc1a8094040ed7ae2bElliott Hughes     * somewhat technical. In particular, it does <i>not</i> mean that the field's value is up
108569bcb487b7317dde579a8ddc1a8094040ed7ae2bElliott Hughes     * to date. If you want to know whether a field contains an up-to-date value, you must also
108669bcb487b7317dde579a8ddc1a8094040ed7ae2bElliott Hughes     * check {@code areFieldsSet}, making this method somewhat useless unless you're a subclass,
108769bcb487b7317dde579a8ddc1a8094040ed7ae2bElliott Hughes     * in which case you can access the {@code isSet} array directly.
108869bcb487b7317dde579a8ddc1a8094040ed7ae2bElliott Hughes     * <p>
108969bcb487b7317dde579a8ddc1a8094040ed7ae2bElliott Hughes     * A field remains "set" from the first time its value is computed until it's cleared by one
109069bcb487b7317dde579a8ddc1a8094040ed7ae2bElliott Hughes     * of the {@code clear} methods. Thus "set" does not mean "valid". You probably want to call
109169bcb487b7317dde579a8ddc1a8094040ed7ae2bElliott Hughes     * {@code get} -- which will update fields as necessary -- rather than try to make use of
109269bcb487b7317dde579a8ddc1a8094040ed7ae2bElliott Hughes     * this method.
1093adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1094adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public final boolean isSet(int field) {
1095adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return isSet[field];
1096adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1097adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1098adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1099e040b50765cafb84783245ed959b1f5b6ded8de4Elliott Hughes     * Adds the given amount to the given field and wraps the value of
1100adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * the field when it goes beyond the maximum or minimum value for the
1101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * current date. Other fields will be adjusted as required to maintain a
1102adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * consistent date.
1103adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void roll(int field, int value) {
1105adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        boolean increment = value >= 0;
1106adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        int count = increment ? value : -value;
1107adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        for (int i = 0; i < count; i++) {
1108adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            roll(field, increment);
1109adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
1110adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1111adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1113e040b50765cafb84783245ed959b1f5b6ded8de4Elliott Hughes     * Increment or decrement the given field and wrap the value of the
1114adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * field when it goes beyond the maximum or minimum value for the current
1115adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * date. Other fields will be adjusted as required to maintain a consistent
1116adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * date.
1117adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1118d29fddcf333997fc2d7429d531e4d934dc705c88Jesse Wilson    public abstract void roll(int field, boolean increment);
1119adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1120adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1121e040b50765cafb84783245ed959b1f5b6ded8de4Elliott Hughes     * Sets the given field to the given value.
1122adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1123adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void set(int field, int value) {
1124adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        fields[field] = value;
1125adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        isSet[field] = true;
1126adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        areFieldsSet = isTimeSet = false;
1127adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (field > MONTH && field < AM_PM) {
1128adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            lastDateFieldSet = field;
1129adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
1130adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (field == HOUR || field == HOUR_OF_DAY) {
1131adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            lastTimeFieldSet = field;
1132adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
1133adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (field == AM_PM) {
1134adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            lastTimeFieldSet = HOUR;
1135adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
1136adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1137adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1138adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1139e040b50765cafb84783245ed959b1f5b6ded8de4Elliott Hughes     * Sets the year, month, and day of the month fields.
1140e040b50765cafb84783245ed959b1f5b6ded8de4Elliott Hughes     * Other fields are not changed; call {@link #clear} first if this is not desired.
1141e040b50765cafb84783245ed959b1f5b6ded8de4Elliott Hughes     * The month value is 0-based, so it may be clearer to use a constant like {@code JANUARY}.
1142adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1143adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public final void set(int year, int month, int day) {
1144adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        set(YEAR, year);
1145adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        set(MONTH, month);
1146adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        set(DATE, day);
1147adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1148adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1149adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1150e040b50765cafb84783245ed959b1f5b6ded8de4Elliott Hughes     * Sets the year, month, day of the month, hour of day, and minute fields.
1151e040b50765cafb84783245ed959b1f5b6ded8de4Elliott Hughes     * Other fields are not changed; call {@link #clear} first if this is not desired.
1152e040b50765cafb84783245ed959b1f5b6ded8de4Elliott Hughes     * The month value is 0-based, so it may be clearer to use a constant like {@code JANUARY}.
1153e040b50765cafb84783245ed959b1f5b6ded8de4Elliott Hughes     */
1154e040b50765cafb84783245ed959b1f5b6ded8de4Elliott Hughes    public final void set(int year, int month, int day, int hourOfDay, int minute) {
1155adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        set(year, month, day);
1156adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        set(HOUR_OF_DAY, hourOfDay);
1157adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        set(MINUTE, minute);
1158adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1159adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1160adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1161e040b50765cafb84783245ed959b1f5b6ded8de4Elliott Hughes     * Sets the year, month, day of the month, hour of day, minute, and second fields.
1162e040b50765cafb84783245ed959b1f5b6ded8de4Elliott Hughes     * Other fields are not changed; call {@link #clear} first if this is not desired.
1163e040b50765cafb84783245ed959b1f5b6ded8de4Elliott Hughes     * The month value is 0-based, so it may be clearer to use a constant like {@code JANUARY}.
1164e040b50765cafb84783245ed959b1f5b6ded8de4Elliott Hughes     */
1165e040b50765cafb84783245ed959b1f5b6ded8de4Elliott Hughes    public final void set(int year, int month, int day, int hourOfDay, int minute, int second) {
1166adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        set(year, month, day, hourOfDay, minute);
1167adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        set(SECOND, second);
1168adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1169adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1170adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1171adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sets the first day of the week for this {@code Calendar}.
1172e040b50765cafb84783245ed959b1f5b6ded8de4Elliott Hughes     * The value should be a day of the week such as {@code MONDAY}.
1173adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1174adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void setFirstDayOfWeek(int value) {
1175adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        firstDayOfWeek = value;
1176adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1177adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1178adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1179e040b50765cafb84783245ed959b1f5b6ded8de4Elliott Hughes     * Sets whether this {@code Calendar} accepts field values which are outside the valid
1180adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * range for the field.
1181adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1182adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void setLenient(boolean value) {
1183adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        lenient = value;
1184adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1185adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1186adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1187adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sets the minimal days in the first week of the year.
1188adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1189adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void setMinimalDaysInFirstWeek(int value) {
1190adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        minimalDaysInFirstWeek = value;
1191adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1192adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1193adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1194adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sets the time of this {@code Calendar}.
1195adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1196adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public final void setTime(Date date) {
1197adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        setTimeInMillis(date.getTime());
1198adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1199adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1200adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1201e040b50765cafb84783245ed959b1f5b6ded8de4Elliott Hughes     * Sets the time of this {@code Calendar} to the given Unix time. See {@link Date} for more
1202e040b50765cafb84783245ed959b1f5b6ded8de4Elliott Hughes     * about what this means.
1203adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1204adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void setTimeInMillis(long milliseconds) {
1205f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson        if (!isTimeSet || !areFieldsSet || time != milliseconds) {
1206f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson            time = milliseconds;
1207f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson            isTimeSet = true;
1208f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson            areFieldsSet = false;
1209f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson            complete();
1210f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson        }
1211adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1212adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1213adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1214adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sets the {@code TimeZone} used by this Calendar.
1215adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1216adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void setTimeZone(TimeZone timezone) {
1217adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        zone = timezone;
1218f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson        areFieldsSet = false;
1219adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1220adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1221adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1222e040b50765cafb84783245ed959b1f5b6ded8de4Elliott Hughes     * Returns a string representation of this {@code Calendar}, showing which fields are set.
1223adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1224adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
1225adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public String toString() {
1226e4a533f2e6b22bd6183285c96d7907a97389240bElliott Hughes        StringBuilder result = new StringBuilder(getClass().getName() +
1227e4a533f2e6b22bd6183285c96d7907a97389240bElliott Hughes                "[time=" + (isTimeSet ? String.valueOf(time) : "?") +
1228e4a533f2e6b22bd6183285c96d7907a97389240bElliott Hughes                ",areFieldsSet=" + areFieldsSet +
1229e4a533f2e6b22bd6183285c96d7907a97389240bElliott Hughes                ",lenient=" + lenient +
1230e4a533f2e6b22bd6183285c96d7907a97389240bElliott Hughes                ",zone=" + zone.getID() +
1231e4a533f2e6b22bd6183285c96d7907a97389240bElliott Hughes                ",firstDayOfWeek=" + firstDayOfWeek +
1232e4a533f2e6b22bd6183285c96d7907a97389240bElliott Hughes                ",minimalDaysInFirstWeek=" + minimalDaysInFirstWeek);
1233adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        for (int i = 0; i < FIELD_COUNT; i++) {
1234adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            result.append(',');
12352e43b95339579a2ea8b749d7598677bb44f2770fElliott Hughes            result.append(FIELD_NAMES[i]);
1236adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            result.append('=');
1237adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (isSet[i]) {
1238adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                result.append(fields[i]);
1239adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            } else {
1240adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                result.append('?');
1241adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
1242adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
1243adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        result.append(']');
1244adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return result.toString();
1245adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1246adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1247adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1248e040b50765cafb84783245ed959b1f5b6ded8de4Elliott Hughes     * Compares the time represented by this {@code Calendar} to that represented by the given
1249e040b50765cafb84783245ed959b1f5b6ded8de4Elliott Hughes     * {@code Calendar}.
1250f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
1251adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return 0 if the times of the two {@code Calendar}s are equal, -1 if the time of
1252adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         this {@code Calendar} is before the other one, 1 if the time of this
1253adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         {@code Calendar} is after the other one.
1254adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws NullPointerException
1255adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if the argument is null.
1256adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IllegalArgumentException
1257adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if the argument does not include a valid time
1258adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             value.
1259adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1260adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public int compareTo(Calendar anotherCalendar) {
1261b46dab348e2007bc08abaf7ecae34d89a2474e50Elliott Hughes        if (anotherCalendar == null) {
126286acc043d3334651ee26c65467d78d6cefedd397Kenny Root            throw new NullPointerException("anotherCalendar == null");
1263adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
1264adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        long timeInMillis = getTimeInMillis();
1265adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        long anotherTimeInMillis = anotherCalendar.getTimeInMillis();
1266adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (timeInMillis > anotherTimeInMillis) {
1267adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return 1;
1268adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
1269adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (timeInMillis == anotherTimeInMillis) {
1270adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return 0;
1271adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
1272adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return -1;
1273adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1274adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
12752e43b95339579a2ea8b749d7598677bb44f2770fElliott Hughes    /**
12762e43b95339579a2ea8b749d7598677bb44f2770fElliott Hughes     * Returns a human-readable string for the value of {@code field}
12772e43b95339579a2ea8b749d7598677bb44f2770fElliott Hughes     * using the given style and locale. If no string is available, returns null.
12782e43b95339579a2ea8b749d7598677bb44f2770fElliott Hughes     * The value is retrieved by invoking {@code get(field)}.
1279f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
12802e43b95339579a2ea8b749d7598677bb44f2770fElliott Hughes     * <p>For example, {@code getDisplayName(MONTH, SHORT, Locale.US)} will return "Jan"
12812e43b95339579a2ea8b749d7598677bb44f2770fElliott Hughes     * while {@code getDisplayName(MONTH, LONG, Locale.US)} will return "January".
1282f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
12832e43b95339579a2ea8b749d7598677bb44f2770fElliott Hughes     * @param field the field
12842e43b95339579a2ea8b749d7598677bb44f2770fElliott Hughes     * @param style {@code SHORT} or {@code LONG}
12852e43b95339579a2ea8b749d7598677bb44f2770fElliott Hughes     * @param locale the locale
12862e43b95339579a2ea8b749d7598677bb44f2770fElliott Hughes     * @return the display name, or null
12872e43b95339579a2ea8b749d7598677bb44f2770fElliott Hughes     * @throws NullPointerException if {@code locale == null}
12882e43b95339579a2ea8b749d7598677bb44f2770fElliott Hughes     * @throws IllegalArgumentException if {@code field} or {@code style} is invalid
12892e43b95339579a2ea8b749d7598677bb44f2770fElliott Hughes     * @since 1.6
12902e43b95339579a2ea8b749d7598677bb44f2770fElliott Hughes     */
12912e43b95339579a2ea8b749d7598677bb44f2770fElliott Hughes    public String getDisplayName(int field, int style, Locale locale) {
12922e43b95339579a2ea8b749d7598677bb44f2770fElliott Hughes        // TODO: the RI's documentation says ALL_STYLES is invalid, but actually treats it as SHORT.
12932e43b95339579a2ea8b749d7598677bb44f2770fElliott Hughes        if (style == ALL_STYLES) {
12942e43b95339579a2ea8b749d7598677bb44f2770fElliott Hughes            style = SHORT;
12952e43b95339579a2ea8b749d7598677bb44f2770fElliott Hughes        }
12962e43b95339579a2ea8b749d7598677bb44f2770fElliott Hughes        String[] array = getDisplayNameArray(field, style, locale);
12972e43b95339579a2ea8b749d7598677bb44f2770fElliott Hughes        int value = get(field);
12982e43b95339579a2ea8b749d7598677bb44f2770fElliott Hughes        return (array != null) ? array[value] : null;
12992e43b95339579a2ea8b749d7598677bb44f2770fElliott Hughes    }
13002e43b95339579a2ea8b749d7598677bb44f2770fElliott Hughes
13012e43b95339579a2ea8b749d7598677bb44f2770fElliott Hughes    private String[] getDisplayNameArray(int field, int style, Locale locale) {
13022e43b95339579a2ea8b749d7598677bb44f2770fElliott Hughes        if (field < 0 || field >= FIELD_COUNT) {
13032e43b95339579a2ea8b749d7598677bb44f2770fElliott Hughes            throw new IllegalArgumentException("bad field " + field);
13042e43b95339579a2ea8b749d7598677bb44f2770fElliott Hughes        }
13052e43b95339579a2ea8b749d7598677bb44f2770fElliott Hughes        checkStyle(style);
13062e43b95339579a2ea8b749d7598677bb44f2770fElliott Hughes        DateFormatSymbols dfs = DateFormatSymbols.getInstance(locale);
13072e43b95339579a2ea8b749d7598677bb44f2770fElliott Hughes        switch (field) {
13082e43b95339579a2ea8b749d7598677bb44f2770fElliott Hughes        case AM_PM:
13092e43b95339579a2ea8b749d7598677bb44f2770fElliott Hughes            return dfs.getAmPmStrings();
13102e43b95339579a2ea8b749d7598677bb44f2770fElliott Hughes        case DAY_OF_WEEK:
13112e43b95339579a2ea8b749d7598677bb44f2770fElliott Hughes            return (style == LONG) ? dfs.getWeekdays() : dfs.getShortWeekdays();
13122e43b95339579a2ea8b749d7598677bb44f2770fElliott Hughes        case ERA:
13132e43b95339579a2ea8b749d7598677bb44f2770fElliott Hughes            return dfs.getEras();
13142e43b95339579a2ea8b749d7598677bb44f2770fElliott Hughes        case MONTH:
13152e43b95339579a2ea8b749d7598677bb44f2770fElliott Hughes            return (style == LONG) ? dfs.getMonths() : dfs.getShortMonths();
13162e43b95339579a2ea8b749d7598677bb44f2770fElliott Hughes        }
13172e43b95339579a2ea8b749d7598677bb44f2770fElliott Hughes        return null;
13182e43b95339579a2ea8b749d7598677bb44f2770fElliott Hughes    }
13192e43b95339579a2ea8b749d7598677bb44f2770fElliott Hughes
13202e43b95339579a2ea8b749d7598677bb44f2770fElliott Hughes    private static void checkStyle(int style) {
13212e43b95339579a2ea8b749d7598677bb44f2770fElliott Hughes        if (style != ALL_STYLES && style != SHORT && style != LONG) {
13222e43b95339579a2ea8b749d7598677bb44f2770fElliott Hughes            throw new IllegalArgumentException("bad style " + style);
13232e43b95339579a2ea8b749d7598677bb44f2770fElliott Hughes        }
13242e43b95339579a2ea8b749d7598677bb44f2770fElliott Hughes    }
13252e43b95339579a2ea8b749d7598677bb44f2770fElliott Hughes
13262e43b95339579a2ea8b749d7598677bb44f2770fElliott Hughes    /**
13272e43b95339579a2ea8b749d7598677bb44f2770fElliott Hughes     * Returns a map of human-readable strings to corresponding values,
13282e43b95339579a2ea8b749d7598677bb44f2770fElliott Hughes     * for the given field, style, and locale.
13292e43b95339579a2ea8b749d7598677bb44f2770fElliott Hughes     * Returns null if no strings are available.
1330f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
13312e43b95339579a2ea8b749d7598677bb44f2770fElliott Hughes     * <p>For example, {@code getDisplayNames(MONTH, ALL_STYLES, Locale.US)} would
1332bf87c56b39383f6b11c36c3cdc93df4b03fed914Brian Carlstrom     * contain mappings from "Jan" and "January" to {@link #JANUARY}, and so on.
1333f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
13342e43b95339579a2ea8b749d7598677bb44f2770fElliott Hughes     * @param field the field
13352e43b95339579a2ea8b749d7598677bb44f2770fElliott Hughes     * @param style {@code SHORT}, {@code LONG}, or {@code ALL_STYLES}
13362e43b95339579a2ea8b749d7598677bb44f2770fElliott Hughes     * @param locale the locale
13372e43b95339579a2ea8b749d7598677bb44f2770fElliott Hughes     * @return the display name, or null
13382e43b95339579a2ea8b749d7598677bb44f2770fElliott Hughes     * @throws NullPointerException if {@code locale == null}
13392e43b95339579a2ea8b749d7598677bb44f2770fElliott Hughes     * @throws IllegalArgumentException if {@code field} or {@code style} is invalid
13402e43b95339579a2ea8b749d7598677bb44f2770fElliott Hughes     * @since 1.6
13412e43b95339579a2ea8b749d7598677bb44f2770fElliott Hughes     */
13422e43b95339579a2ea8b749d7598677bb44f2770fElliott Hughes    public Map<String, Integer> getDisplayNames(int field, int style, Locale locale) {
13432e43b95339579a2ea8b749d7598677bb44f2770fElliott Hughes        checkStyle(style);
13442e43b95339579a2ea8b749d7598677bb44f2770fElliott Hughes        complete();
13452e43b95339579a2ea8b749d7598677bb44f2770fElliott Hughes        Map<String, Integer> result = new HashMap<String, Integer>();
13462e43b95339579a2ea8b749d7598677bb44f2770fElliott Hughes        if (style == SHORT || style == ALL_STYLES) {
13472e43b95339579a2ea8b749d7598677bb44f2770fElliott Hughes            insertValuesInMap(result, getDisplayNameArray(field, SHORT, locale));
13482e43b95339579a2ea8b749d7598677bb44f2770fElliott Hughes        }
13492e43b95339579a2ea8b749d7598677bb44f2770fElliott Hughes        if (style == LONG || style == ALL_STYLES) {
13502e43b95339579a2ea8b749d7598677bb44f2770fElliott Hughes            insertValuesInMap(result, getDisplayNameArray(field, LONG, locale));
13512e43b95339579a2ea8b749d7598677bb44f2770fElliott Hughes        }
13522e43b95339579a2ea8b749d7598677bb44f2770fElliott Hughes        return result.isEmpty() ? null : result;
13532e43b95339579a2ea8b749d7598677bb44f2770fElliott Hughes    }
13542e43b95339579a2ea8b749d7598677bb44f2770fElliott Hughes
13552e43b95339579a2ea8b749d7598677bb44f2770fElliott Hughes    private static void insertValuesInMap(Map<String, Integer> map, String[] values) {
13562e43b95339579a2ea8b749d7598677bb44f2770fElliott Hughes        if (values == null) {
13572e43b95339579a2ea8b749d7598677bb44f2770fElliott Hughes            return;
13582e43b95339579a2ea8b749d7598677bb44f2770fElliott Hughes        }
13592e43b95339579a2ea8b749d7598677bb44f2770fElliott Hughes        for (int i = 0; i < values.length; ++i) {
13602e43b95339579a2ea8b749d7598677bb44f2770fElliott Hughes            if (values[i] != null && !values[i].isEmpty()) {
13612e43b95339579a2ea8b749d7598677bb44f2770fElliott Hughes                map.put(values[i], i);
13622e43b95339579a2ea8b749d7598677bb44f2770fElliott Hughes            }
13632e43b95339579a2ea8b749d7598677bb44f2770fElliott Hughes        }
13642e43b95339579a2ea8b749d7598677bb44f2770fElliott Hughes    }
13652e43b95339579a2ea8b749d7598677bb44f2770fElliott Hughes
1366adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private static final ObjectStreamField[] serialPersistentFields = {
1367e26ba79900d471d02d656f686926918ef7dc751fElliott Hughes        new ObjectStreamField("areFieldsSet", boolean.class),
136828eb98ecd43c27702e85b0561e040e2da10320a6Elliott Hughes        new ObjectStreamField("fields", int[].class),
1369e26ba79900d471d02d656f686926918ef7dc751fElliott Hughes        new ObjectStreamField("firstDayOfWeek", int.class),
137028eb98ecd43c27702e85b0561e040e2da10320a6Elliott Hughes        new ObjectStreamField("isSet", boolean[].class),
1371e26ba79900d471d02d656f686926918ef7dc751fElliott Hughes        new ObjectStreamField("isTimeSet", boolean.class),
1372e26ba79900d471d02d656f686926918ef7dc751fElliott Hughes        new ObjectStreamField("lenient", boolean.class),
1373e26ba79900d471d02d656f686926918ef7dc751fElliott Hughes        new ObjectStreamField("minimalDaysInFirstWeek", int.class),
1374e26ba79900d471d02d656f686926918ef7dc751fElliott Hughes        new ObjectStreamField("nextStamp", int.class),
1375e26ba79900d471d02d656f686926918ef7dc751fElliott Hughes        new ObjectStreamField("serialVersionOnStream", int.class),
1376e26ba79900d471d02d656f686926918ef7dc751fElliott Hughes        new ObjectStreamField("time", long.class),
137728eb98ecd43c27702e85b0561e040e2da10320a6Elliott Hughes        new ObjectStreamField("zone", TimeZone.class),
137828eb98ecd43c27702e85b0561e040e2da10320a6Elliott Hughes    };
1379adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1380adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private void writeObject(ObjectOutputStream stream) throws IOException {
1381adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        complete();
1382adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        ObjectOutputStream.PutField putFields = stream.putFields();
1383f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes        putFields.put("areFieldsSet", areFieldsSet);
1384f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes        putFields.put("fields", this.fields);
1385f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes        putFields.put("firstDayOfWeek", firstDayOfWeek);
1386f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes        putFields.put("isSet", isSet);
1387f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes        putFields.put("isTimeSet", isTimeSet);
1388f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes        putFields.put("lenient", lenient);
1389f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes        putFields.put("minimalDaysInFirstWeek", minimalDaysInFirstWeek);
1390f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes        putFields.put("nextStamp", 2 /* MINIMUM_USER_STAMP */);
1391f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes        putFields.put("serialVersionOnStream", 1);
1392f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes        putFields.put("time", time);
1393f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes        putFields.put("zone", zone);
1394adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        stream.writeFields();
1395adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1396adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
13971c4b8eb0aebfe7f99c10fb1d01716946e8e74ad7Elliott Hughes    private void readObject(ObjectInputStream stream) throws IOException, ClassNotFoundException {
1398adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        ObjectInputStream.GetField readFields = stream.readFields();
1399f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes        areFieldsSet = readFields.get("areFieldsSet", false);
1400f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes        this.fields = (int[]) readFields.get("fields", null);
1401f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes        firstDayOfWeek = readFields.get("firstDayOfWeek", Calendar.SUNDAY);
1402f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes        isSet = (boolean[]) readFields.get("isSet", null);
1403f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes        isTimeSet = readFields.get("isTimeSet", false);
1404f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes        lenient = readFields.get("lenient", true);
1405f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes        minimalDaysInFirstWeek = readFields.get("minimalDaysInFirstWeek", 1);
1406f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes        time = readFields.get("time", 0L);
1407f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes        zone = (TimeZone) readFields.get("zone", null);
1408adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1409adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project}
1410