151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski/*
22c87ad3a45cecf9e344487cad1abfdebe79f2c7cNarayan Kamath * Copyright (C) 2014 The Android Open Source Project
351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Copyright (c) 1996, 2011, Oracle and/or its affiliates. All rights reserved.
451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * This code is free software; you can redistribute it and/or modify it
751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * under the terms of the GNU General Public License version 2 only, as
851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * published by the Free Software Foundation.  Oracle designates this
951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * particular file as subject to the "Classpath" exception as provided
1051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * by Oracle in the LICENSE file that accompanied this code.
1151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
1251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * This code is distributed in the hope that it will be useful, but WITHOUT
1351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
1451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
1551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * version 2 for more details (a copy is included in the LICENSE file that
1651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * accompanied this code).
1751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
1851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * You should have received a copy of the GNU General Public License version
1951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 2 along with this work; if not, write to the Free Software Foundation,
2051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
2151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
2251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
2351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * or visit www.oracle.com if you need additional information or have any
2451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * questions.
2551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */
2651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
2751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski/*
2851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * (C) Copyright Taligent, Inc. 1996-1998 - All Rights Reserved
2951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * (C) Copyright IBM Corp. 1996-1998 - All Rights Reserved
3051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
3151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *   The original version of this source code and documentation is copyrighted
3251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * and owned by Taligent, Inc., a wholly-owned subsidiary of IBM. These
3351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * materials are provided under terms of a License Agreement between Taligent
3451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * and Sun. This technology is protected by multiple US and International
3551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * patents. This notice and attribution to Taligent may not be removed.
3651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *   Taligent is a registered trademark of Taligent, Inc.
3751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
3851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */
3951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
4051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskipackage java.util;
4151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
4251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.io.IOException;
4351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.io.ObjectInputStream;
4451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.io.ObjectOutputStream;
4551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.io.OptionalDataException;
4651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.io.Serializable;
4751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.security.AccessControlContext;
4851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.security.AccessController;
4951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.security.PermissionCollection;
5051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.security.PrivilegedActionException;
5151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.security.PrivilegedExceptionAction;
5251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.security.ProtectionDomain;
5351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.text.DateFormat;
5451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.text.DateFormatSymbols;
5551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.util.concurrent.ConcurrentHashMap;
5651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.util.concurrent.ConcurrentMap;
579c853c5b9ebbb0ef60a013ae10ee411d70dfa832Piotr Jastrzebskiimport libcore.icu.LocaleData;
5851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
5951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski/**
6051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * The <code>Calendar</code> class is an abstract class that provides methods
6151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * for converting between a specific instant in time and a set of {@link
6251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * #fields calendar fields} such as <code>YEAR</code>, <code>MONTH</code>,
6351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <code>DAY_OF_MONTH</code>, <code>HOUR</code>, and so on, and for
6451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * manipulating the calendar fields, such as getting the date of the next
6551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * week. An instant in time can be represented by a millisecond value that is
6651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * an offset from the <a name="Epoch"><em>Epoch</em></a>, January 1, 1970
6751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 00:00:00.000 GMT (Gregorian).
6851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
6951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p>The class also provides additional fields and methods for
7051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * implementing a concrete calendar system outside the package. Those
7151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * fields and methods are defined as <code>protected</code>.
7251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
7351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p>
7451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Like other locale-sensitive classes, <code>Calendar</code> provides a
7551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * class method, <code>getInstance</code>, for getting a generally useful
7651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * object of this type. <code>Calendar</code>'s <code>getInstance</code> method
7751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * returns a <code>Calendar</code> object whose
7851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * calendar fields have been initialized with the current date and time:
7951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <blockquote>
8051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <pre>
8151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *     Calendar rightNow = Calendar.getInstance();
8251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * </pre>
8351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * </blockquote>
8451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
8551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p>A <code>Calendar</code> object can produce all the calendar field values
8651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * needed to implement the date-time formatting for a particular language and
8751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * calendar style (for example, Japanese-Gregorian, Japanese-Traditional).
8851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <code>Calendar</code> defines the range of values returned by
8951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * certain calendar fields, as well as their meaning.  For example,
9051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * the first month of the calendar system has value <code>MONTH ==
9151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * JANUARY</code> for all calendars.  Other values are defined by the
9251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * concrete subclass, such as <code>ERA</code>.  See individual field
9351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * documentation and subclass documentation for details.
9451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
9551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <h4>Getting and Setting Calendar Field Values</h4>
9651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
9751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p>The calendar field values can be set by calling the <code>set</code>
9851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * methods. Any field values set in a <code>Calendar</code> will not be
9951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * interpreted until it needs to calculate its time value (milliseconds from
10051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * the Epoch) or values of the calendar fields. Calling the
10151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <code>get</code>, <code>getTimeInMillis</code>, <code>getTime</code>,
10251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <code>add</code> and <code>roll</code> involves such calculation.
10351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
10451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <h4>Leniency</h4>
10551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
10651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p><code>Calendar</code> has two modes for interpreting the calendar
10751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * fields, <em>lenient</em> and <em>non-lenient</em>.  When a
10851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <code>Calendar</code> is in lenient mode, it accepts a wider range of
10951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * calendar field values than it produces.  When a <code>Calendar</code>
11051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * recomputes calendar field values for return by <code>get()</code>, all of
11151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * the calendar fields are normalized. For example, a lenient
11251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <code>GregorianCalendar</code> interprets <code>MONTH == JANUARY</code>,
11351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <code>DAY_OF_MONTH == 32</code> as February 1.
11451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
11551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p>When a <code>Calendar</code> is in non-lenient mode, it throws an
11651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * exception if there is any inconsistency in its calendar fields. For
11751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * example, a <code>GregorianCalendar</code> always produces
11851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <code>DAY_OF_MONTH</code> values between 1 and the length of the month. A
11951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * non-lenient <code>GregorianCalendar</code> throws an exception upon
12051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * calculating its time or calendar field values if any out-of-range field
12151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * value has been set.
12251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
12351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <h4><a name="first_week">First Week</a></h4>
12451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
12551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <code>Calendar</code> defines a locale-specific seven day week using two
12651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * parameters: the first day of the week and the minimal days in first week
12751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * (from 1 to 7).  These numbers are taken from the locale resource data when a
12851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <code>Calendar</code> is constructed.  They may also be specified explicitly
12951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * through the methods for setting their values.
13051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
13151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p>When setting or getting the <code>WEEK_OF_MONTH</code> or
13251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <code>WEEK_OF_YEAR</code> fields, <code>Calendar</code> must determine the
13351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * first week of the month or year as a reference point.  The first week of a
13451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * month or year is defined as the earliest seven day period beginning on
13551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <code>getFirstDayOfWeek()</code> and containing at least
13651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <code>getMinimalDaysInFirstWeek()</code> days of that month or year.  Weeks
13751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * numbered ..., -1, 0 precede the first week; weeks numbered 2, 3,... follow
13851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * it.  Note that the normalized numbering returned by <code>get()</code> may be
13951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * different.  For example, a specific <code>Calendar</code> subclass may
14051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * designate the week before week 1 of a year as week <code><i>n</i></code> of
14151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * the previous year.
14251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
14351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <h4>Calendar Fields Resolution</h4>
14451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
14551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * When computing a date and time from the calendar fields, there
14651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * may be insufficient information for the computation (such as only
14751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * year and month with no day of month), or there may be inconsistent
14851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * information (such as Tuesday, July 15, 1996 (Gregorian) -- July 15,
14951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 1996 is actually a Monday). <code>Calendar</code> will resolve
15051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * calendar field values to determine the date and time in the
15151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * following way.
15251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
15351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p>If there is any conflict in calendar field values,
15451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <code>Calendar</code> gives priorities to calendar fields that have been set
15551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * more recently. The following are the default combinations of the
15651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * calendar fields. The most recent combination, as determined by the
15751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * most recently set single field, will be used.
15851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
15951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p><a name="date_resolution">For the date fields</a>:
16051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <blockquote>
16151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <pre>
16251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * YEAR + MONTH + DAY_OF_MONTH
16351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * YEAR + MONTH + WEEK_OF_MONTH + DAY_OF_WEEK
16451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * YEAR + MONTH + DAY_OF_WEEK_IN_MONTH + DAY_OF_WEEK
16551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * YEAR + DAY_OF_YEAR
16651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * YEAR + DAY_OF_WEEK + WEEK_OF_YEAR
16751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * </pre></blockquote>
16851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
16951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <a name="time_resolution">For the time of day fields</a>:
17051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <blockquote>
17151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <pre>
17251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * HOUR_OF_DAY
17351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * AM_PM + HOUR
17451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * </pre></blockquote>
17551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
17651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p>If there are any calendar fields whose values haven't been set in the selected
17751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * field combination, <code>Calendar</code> uses their default values. The default
17851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * value of each field may vary by concrete calendar systems. For example, in
17951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <code>GregorianCalendar</code>, the default of a field is the same as that
18051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * of the start of the Epoch: i.e., <code>YEAR = 1970</code>, <code>MONTH =
18151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * JANUARY</code>, <code>DAY_OF_MONTH = 1</code>, etc.
18251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
18351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p>
18451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <strong>Note:</strong> There are certain possible ambiguities in
18551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * interpretation of certain singular times, which are resolved in the
18651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * following ways:
18751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <ol>
18851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *     <li> 23:59 is the last minute of the day and 00:00 is the first
18951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *          minute of the next day. Thus, 23:59 on Dec 31, 1999 &lt; 00:00 on
19051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *          Jan 1, 2000 &lt; 00:01 on Jan 1, 2000.
19151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
19251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *     <li> Although historically not precise, midnight also belongs to "am",
19351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *          and noon belongs to "pm", so on the same day,
19451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *          12:00 am (midnight) &lt; 12:01 am, and 12:00 pm (noon) &lt; 12:01 pm
19551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * </ol>
19651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
19751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p>
19851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * The date or time format strings are not part of the definition of a
19951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * calendar, as those must be modifiable or overridable by the user at
20051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * runtime. Use {@link DateFormat}
20151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * to format dates.
20251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
20351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <h4>Field Manipulation</h4>
20451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
20551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * The calendar fields can be changed using three methods:
20651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <code>set()</code>, <code>add()</code>, and <code>roll()</code>.</p>
20751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
20851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p><strong><code>set(f, value)</code></strong> changes calendar field
20951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <code>f</code> to <code>value</code>.  In addition, it sets an
21051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * internal member variable to indicate that calendar field <code>f</code> has
21151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * been changed. Although calendar field <code>f</code> is changed immediately,
21251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * the calendar's time value in milliseconds is not recomputed until the next call to
21351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <code>get()</code>, <code>getTime()</code>, <code>getTimeInMillis()</code>,
21451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <code>add()</code>, or <code>roll()</code> is made. Thus, multiple calls to
21551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <code>set()</code> do not trigger multiple, unnecessary
21651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * computations. As a result of changing a calendar field using
21751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <code>set()</code>, other calendar fields may also change, depending on the
21851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * calendar field, the calendar field value, and the calendar system. In addition,
21951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <code>get(f)</code> will not necessarily return <code>value</code> set by
22051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * the call to the <code>set</code> method
22151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * after the calendar fields have been recomputed. The specifics are determined by
22251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * the concrete calendar class.</p>
22351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
22451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p><em>Example</em>: Consider a <code>GregorianCalendar</code>
22551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * originally set to August 31, 1999. Calling <code>set(Calendar.MONTH,
22651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Calendar.SEPTEMBER)</code> sets the date to September 31,
22751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 1999. This is a temporary internal representation that resolves to
22851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * October 1, 1999 if <code>getTime()</code>is then called. However, a
22951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * call to <code>set(Calendar.DAY_OF_MONTH, 30)</code> before the call to
23051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <code>getTime()</code> sets the date to September 30, 1999, since
23151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * no recomputation occurs after <code>set()</code> itself.</p>
23251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
23351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p><strong><code>add(f, delta)</code></strong> adds <code>delta</code>
23451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * to field <code>f</code>.  This is equivalent to calling <code>set(f,
23551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * get(f) + delta)</code> with two adjustments:</p>
23651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
23751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <blockquote>
23851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *   <p><strong>Add rule 1</strong>. The value of field <code>f</code>
23951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *   after the call minus the value of field <code>f</code> before the
24051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *   call is <code>delta</code>, modulo any overflow that has occurred in
24151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *   field <code>f</code>. Overflow occurs when a field value exceeds its
24251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *   range and, as a result, the next larger field is incremented or
24351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *   decremented and the field value is adjusted back into its range.</p>
24451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
24551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *   <p><strong>Add rule 2</strong>. If a smaller field is expected to be
24651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *   invariant, but it is impossible for it to be equal to its
24751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *   prior value because of changes in its minimum or maximum after field
24851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *   <code>f</code> is changed or other constraints, such as time zone
24951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *   offset changes, then its value is adjusted to be as close
25051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *   as possible to its expected value. A smaller field represents a
25151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *   smaller unit of time. <code>HOUR</code> is a smaller field than
25251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *   <code>DAY_OF_MONTH</code>. No adjustment is made to smaller fields
25351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *   that are not expected to be invariant. The calendar system
25451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *   determines what fields are expected to be invariant.</p>
25551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * </blockquote>
25651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
25751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p>In addition, unlike <code>set()</code>, <code>add()</code> forces
25851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * an immediate recomputation of the calendar's milliseconds and all
25951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * fields.</p>
26051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
26151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p><em>Example</em>: Consider a <code>GregorianCalendar</code>
26251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * originally set to August 31, 1999. Calling <code>add(Calendar.MONTH,
26351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 13)</code> sets the calendar to September 30, 2000. <strong>Add rule
26451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 1</strong> sets the <code>MONTH</code> field to September, since
26551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * adding 13 months to August gives September of the next year. Since
26651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <code>DAY_OF_MONTH</code> cannot be 31 in September in a
26751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <code>GregorianCalendar</code>, <strong>add rule 2</strong> sets the
26851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <code>DAY_OF_MONTH</code> to 30, the closest possible value. Although
26951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * it is a smaller field, <code>DAY_OF_WEEK</code> is not adjusted by
27051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * rule 2, since it is expected to change when the month changes in a
27151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <code>GregorianCalendar</code>.</p>
27251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
27351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p><strong><code>roll(f, delta)</code></strong> adds
27451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <code>delta</code> to field <code>f</code> without changing larger
27551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * fields. This is equivalent to calling <code>add(f, delta)</code> with
27651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * the following adjustment:</p>
27751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
27851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <blockquote>
27951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *   <p><strong>Roll rule</strong>. Larger fields are unchanged after the
28051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *   call. A larger field represents a larger unit of
28151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *   time. <code>DAY_OF_MONTH</code> is a larger field than
28251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *   <code>HOUR</code>.</p>
28351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * </blockquote>
28451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
28551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p><em>Example</em>: See {@link java.util.GregorianCalendar#roll(int, int)}.
28651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
28751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p><strong>Usage model</strong>. To motivate the behavior of
28851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <code>add()</code> and <code>roll()</code>, consider a user interface
28951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * component with increment and decrement buttons for the month, day, and
29051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * year, and an underlying <code>GregorianCalendar</code>. If the
29151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * interface reads January 31, 1999 and the user presses the month
29251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * increment button, what should it read? If the underlying
29351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * implementation uses <code>set()</code>, it might read March 3, 1999. A
29451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * better result would be February 28, 1999. Furthermore, if the user
29551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * presses the month increment button again, it should read March 31,
29651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 1999, not March 28, 1999. By saving the original date and using either
29751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <code>add()</code> or <code>roll()</code>, depending on whether larger
29851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * fields should be affected, the user interface can behave as most users
29951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * will intuitively expect.</p>
30051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
30151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @see          java.lang.System#currentTimeMillis()
30251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @see          Date
30351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @see          GregorianCalendar
30451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @see          TimeZone
30551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @see          java.text.DateFormat
30651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @author Mark Davis, David Goldsmith, Chen-Lieh Huang, Alan Liu
30751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @since JDK1.1
30851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */
30951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskipublic abstract class Calendar implements Serializable, Cloneable, Comparable<Calendar> {
31051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
31151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    // Data flow in Calendar
31251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    // ---------------------
31351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
31451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    // The current time is represented in two ways by Calendar: as UTC
31551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    // milliseconds from the epoch (1 January 1970 0:00 UTC), and as local
31651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    // fields such as MONTH, HOUR, AM_PM, etc.  It is possible to compute the
31751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    // millis from the fields, and vice versa.  The data needed to do this
31851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    // conversion is encapsulated by a TimeZone object owned by the Calendar.
31951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    // The data provided by the TimeZone object may also be overridden if the
32051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    // user sets the ZONE_OFFSET and/or DST_OFFSET fields directly. The class
32151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    // keeps track of what information was most recently set by the caller, and
32251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    // uses that to compute any other information as needed.
32351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
32451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    // If the user sets the fields using set(), the data flow is as follows.
32551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    // This is implemented by the Calendar subclass's computeTime() method.
32651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    // During this process, certain fields may be ignored.  The disambiguation
32751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    // algorithm for resolving which fields to pay attention to is described
32851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    // in the class documentation.
32951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
33051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    //   local fields (YEAR, MONTH, DATE, HOUR, MINUTE, etc.)
33151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    //           |
33251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    //           | Using Calendar-specific algorithm
33351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    //           V
33451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    //   local standard millis
33551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    //           |
33651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    //           | Using TimeZone or user-set ZONE_OFFSET / DST_OFFSET
33751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    //           V
33851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    //   UTC millis (in time data member)
33951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
34051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    // If the user sets the UTC millis using setTime() or setTimeInMillis(),
34151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    // the data flow is as follows.  This is implemented by the Calendar
34251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    // subclass's computeFields() method.
34351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
34451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    //   UTC millis (in time data member)
34551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    //           |
34651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    //           | Using TimeZone getOffset()
34751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    //           V
34851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    //   local standard millis
34951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    //           |
35051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    //           | Using Calendar-specific algorithm
35151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    //           V
35251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    //   local fields (YEAR, MONTH, DATE, HOUR, MINUTE, etc.)
35351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
35451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    // In general, a round trip from fields, through local and UTC millis, and
35551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    // back out to fields is made when necessary.  This is implemented by the
35651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    // complete() method.  Resolving a partial set of fields into a UTC millis
35751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    // value allows all remaining fields to be generated from that value.  If
35851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    // the Calendar is lenient, the fields are also renormalized to standard
35951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    // ranges when they are regenerated.
36051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
36151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
36251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Field number for <code>get</code> and <code>set</code> indicating the
36351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * era, e.g., AD or BC in the Julian calendar. This is a calendar-specific
36451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * value; see subclass documentation.
36551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
36651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see GregorianCalendar#AD
36751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see GregorianCalendar#BC
36851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
36951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public final static int ERA = 0;
37051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
37151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
37251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Field number for <code>get</code> and <code>set</code> indicating the
37351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * year. This is a calendar-specific value; see subclass documentation.
37451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
37551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public final static int YEAR = 1;
37651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
37751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
37851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Field number for <code>get</code> and <code>set</code> indicating the
37951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * month. This is a calendar-specific value. The first month of
38051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * the year in the Gregorian and Julian calendars is
38151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <code>JANUARY</code> which is 0; the last depends on the number
38251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * of months in a year.
38351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
38451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see #JANUARY
38551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see #FEBRUARY
38651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see #MARCH
38751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see #APRIL
38851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see #MAY
38951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see #JUNE
39051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see #JULY
39151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see #AUGUST
39251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see #SEPTEMBER
39351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see #OCTOBER
39451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see #NOVEMBER
39551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see #DECEMBER
39651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see #UNDECIMBER
39751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
39851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public final static int MONTH = 2;
39951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
40051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
40151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Field number for <code>get</code> and <code>set</code> indicating the
40251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * week number within the current year.  The first week of the year, as
40351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * defined by <code>getFirstDayOfWeek()</code> and
40451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <code>getMinimalDaysInFirstWeek()</code>, has value 1.  Subclasses define
40551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * the value of <code>WEEK_OF_YEAR</code> for days before the first week of
40651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * the year.
40751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
40851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see #getFirstDayOfWeek
40951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see #getMinimalDaysInFirstWeek
41051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
41151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public final static int WEEK_OF_YEAR = 3;
41251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
41351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
41451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Field number for <code>get</code> and <code>set</code> indicating the
41551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * week number within the current month.  The first week of the month, as
41651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * defined by <code>getFirstDayOfWeek()</code> and
41751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <code>getMinimalDaysInFirstWeek()</code>, has value 1.  Subclasses define
41851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * the value of <code>WEEK_OF_MONTH</code> for days before the first week of
41951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * the month.
42051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
42151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see #getFirstDayOfWeek
42251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see #getMinimalDaysInFirstWeek
42351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
42451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public final static int WEEK_OF_MONTH = 4;
42551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
42651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
42751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Field number for <code>get</code> and <code>set</code> indicating the
42851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * day of the month. This is a synonym for <code>DAY_OF_MONTH</code>.
42951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * The first day of the month has value 1.
43051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
43151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see #DAY_OF_MONTH
43251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
43351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public final static int DATE = 5;
43451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
43551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
43651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Field number for <code>get</code> and <code>set</code> indicating the
43751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * day of the month. This is a synonym for <code>DATE</code>.
43851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * The first day of the month has value 1.
43951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
44051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see #DATE
44151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
44251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public final static int DAY_OF_MONTH = 5;
44351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
44451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
44551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Field number for <code>get</code> and <code>set</code> indicating the day
44651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * number within the current year.  The first day of the year has value 1.
44751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
44851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public final static int DAY_OF_YEAR = 6;
44951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
45051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
45151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Field number for <code>get</code> and <code>set</code> indicating the day
45251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * of the week.  This field takes values <code>SUNDAY</code>,
45351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <code>MONDAY</code>, <code>TUESDAY</code>, <code>WEDNESDAY</code>,
45451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <code>THURSDAY</code>, <code>FRIDAY</code>, and <code>SATURDAY</code>.
45551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
45651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see #SUNDAY
45751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see #MONDAY
45851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see #TUESDAY
45951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see #WEDNESDAY
46051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see #THURSDAY
46151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see #FRIDAY
46251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see #SATURDAY
46351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
46451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public final static int DAY_OF_WEEK = 7;
46551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
46651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
46751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Field number for <code>get</code> and <code>set</code> indicating the
46851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * ordinal number of the day of the week within the current month. Together
46951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * with the <code>DAY_OF_WEEK</code> field, this uniquely specifies a day
47051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * within a month.  Unlike <code>WEEK_OF_MONTH</code> and
47151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <code>WEEK_OF_YEAR</code>, this field's value does <em>not</em> depend on
47251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <code>getFirstDayOfWeek()</code> or
47351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <code>getMinimalDaysInFirstWeek()</code>.  <code>DAY_OF_MONTH 1</code>
47451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * through <code>7</code> always correspond to <code>DAY_OF_WEEK_IN_MONTH
47551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * 1</code>; <code>8</code> through <code>14</code> correspond to
47651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <code>DAY_OF_WEEK_IN_MONTH 2</code>, and so on.
47751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <code>DAY_OF_WEEK_IN_MONTH 0</code> indicates the week before
47851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <code>DAY_OF_WEEK_IN_MONTH 1</code>.  Negative values count back from the
47951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * end of the month, so the last Sunday of a month is specified as
48051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <code>DAY_OF_WEEK = SUNDAY, DAY_OF_WEEK_IN_MONTH = -1</code>.  Because
48151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * negative values count backward they will usually be aligned differently
48251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * within the month than positive values.  For example, if a month has 31
48351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * days, <code>DAY_OF_WEEK_IN_MONTH -1</code> will overlap
48451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <code>DAY_OF_WEEK_IN_MONTH 5</code> and the end of <code>4</code>.
48551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
48651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see #DAY_OF_WEEK
48751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see #WEEK_OF_MONTH
48851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
48951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public final static int DAY_OF_WEEK_IN_MONTH = 8;
49051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
49151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
49251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Field number for <code>get</code> and <code>set</code> indicating
49351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * whether the <code>HOUR</code> is before or after noon.
49451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * E.g., at 10:04:15.250 PM the <code>AM_PM</code> is <code>PM</code>.
49551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
49651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see #AM
49751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see #PM
49851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see #HOUR
49951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
50051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public final static int AM_PM = 9;
50151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
50251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
50351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Field number for <code>get</code> and <code>set</code> indicating the
50451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * hour of the morning or afternoon. <code>HOUR</code> is used for the
50551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * 12-hour clock (0 - 11). Noon and midnight are represented by 0, not by 12.
50651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * E.g., at 10:04:15.250 PM the <code>HOUR</code> is 10.
50751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
50851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see #AM_PM
50951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see #HOUR_OF_DAY
51051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
51151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public final static int HOUR = 10;
51251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
51351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
51451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Field number for <code>get</code> and <code>set</code> indicating the
51551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * hour of the day. <code>HOUR_OF_DAY</code> is used for the 24-hour clock.
51651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * E.g., at 10:04:15.250 PM the <code>HOUR_OF_DAY</code> is 22.
51751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
51851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see #HOUR
51951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
52051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public final static int HOUR_OF_DAY = 11;
52151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
52251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
52351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Field number for <code>get</code> and <code>set</code> indicating the
52451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * minute within the hour.
52551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * E.g., at 10:04:15.250 PM the <code>MINUTE</code> is 4.
52651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
52751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public final static int MINUTE = 12;
52851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
52951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
53051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Field number for <code>get</code> and <code>set</code> indicating the
53151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * second within the minute.
53251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * E.g., at 10:04:15.250 PM the <code>SECOND</code> is 15.
53351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
53451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public final static int SECOND = 13;
53551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
53651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
53751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Field number for <code>get</code> and <code>set</code> indicating the
53851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * millisecond within the second.
53951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * E.g., at 10:04:15.250 PM the <code>MILLISECOND</code> is 250.
54051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
54151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public final static int MILLISECOND = 14;
54251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
54351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
54451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Field number for <code>get</code> and <code>set</code>
54551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * indicating the raw offset from GMT in milliseconds.
54651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <p>
54751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * This field reflects the correct GMT offset value of the time
54851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * zone of this <code>Calendar</code> if the
54951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <code>TimeZone</code> implementation subclass supports
55051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * historical GMT offset changes.
55151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
55251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public final static int ZONE_OFFSET = 15;
55351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
55451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
55551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Field number for <code>get</code> and <code>set</code> indicating the
55651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * daylight saving offset in milliseconds.
55751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <p>
55851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * This field reflects the correct daylight saving offset value of
55951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * the time zone of this <code>Calendar</code> if the
56051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <code>TimeZone</code> implementation subclass supports
56151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * historical Daylight Saving Time schedule changes.
56251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
56351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public final static int DST_OFFSET = 16;
56451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
56551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
56651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * The number of distinct fields recognized by <code>get</code> and <code>set</code>.
56751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Field numbers range from <code>0..FIELD_COUNT-1</code>.
56851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
56951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public final static int FIELD_COUNT = 17;
57051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
57151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
57251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Value of the {@link #DAY_OF_WEEK} field indicating
57351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Sunday.
57451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
57551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public final static int SUNDAY = 1;
57651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
57751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
57851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Value of the {@link #DAY_OF_WEEK} field indicating
57951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Monday.
58051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
58151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public final static int MONDAY = 2;
58251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
58351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
58451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Value of the {@link #DAY_OF_WEEK} field indicating
58551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Tuesday.
58651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
58751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public final static int TUESDAY = 3;
58851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
58951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
59051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Value of the {@link #DAY_OF_WEEK} field indicating
59151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Wednesday.
59251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
59351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public final static int WEDNESDAY = 4;
59451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
59551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
59651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Value of the {@link #DAY_OF_WEEK} field indicating
59751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Thursday.
59851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
59951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public final static int THURSDAY = 5;
60051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
60151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
60251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Value of the {@link #DAY_OF_WEEK} field indicating
60351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Friday.
60451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
60551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public final static int FRIDAY = 6;
60651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
60751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
60851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Value of the {@link #DAY_OF_WEEK} field indicating
60951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Saturday.
61051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
61151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public final static int SATURDAY = 7;
61251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
61351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
61451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Value of the {@link #MONTH} field indicating the
61551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * first month of the year in the Gregorian and Julian calendars.
61651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
61751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public final static int JANUARY = 0;
61851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
61951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
62051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Value of the {@link #MONTH} field indicating the
62151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * second month of the year in the Gregorian and Julian calendars.
62251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
62351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public final static int FEBRUARY = 1;
62451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
62551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
62651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Value of the {@link #MONTH} field indicating the
62751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * third month of the year in the Gregorian and Julian calendars.
62851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
62951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public final static int MARCH = 2;
63051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
63151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
63251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Value of the {@link #MONTH} field indicating the
63351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * fourth month of the year in the Gregorian and Julian calendars.
63451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
63551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public final static int APRIL = 3;
63651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
63751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
63851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Value of the {@link #MONTH} field indicating the
63951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * fifth month of the year in the Gregorian and Julian calendars.
64051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
64151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public final static int MAY = 4;
64251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
64351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
64451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Value of the {@link #MONTH} field indicating the
64551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * sixth month of the year in the Gregorian and Julian calendars.
64651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
64751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public final static int JUNE = 5;
64851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
64951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
65051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Value of the {@link #MONTH} field indicating the
65151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * seventh month of the year in the Gregorian and Julian calendars.
65251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
65351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public final static int JULY = 6;
65451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
65551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
65651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Value of the {@link #MONTH} field indicating the
65751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * eighth month of the year in the Gregorian and Julian calendars.
65851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
65951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public final static int AUGUST = 7;
66051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
66151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
66251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Value of the {@link #MONTH} field indicating the
66351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * ninth month of the year in the Gregorian and Julian calendars.
66451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
66551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public final static int SEPTEMBER = 8;
66651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
66751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
66851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Value of the {@link #MONTH} field indicating the
66951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * tenth month of the year in the Gregorian and Julian calendars.
67051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
67151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public final static int OCTOBER = 9;
67251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
67351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
67451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Value of the {@link #MONTH} field indicating the
67551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * eleventh month of the year in the Gregorian and Julian calendars.
67651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
67751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public final static int NOVEMBER = 10;
67851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
67951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
68051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Value of the {@link #MONTH} field indicating the
68151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * twelfth month of the year in the Gregorian and Julian calendars.
68251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
68351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public final static int DECEMBER = 11;
68451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
68551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
68651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Value of the {@link #MONTH} field indicating the
68751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * thirteenth month of the year. Although <code>GregorianCalendar</code>
68851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * does not use this value, lunar calendars do.
68951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
69051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public final static int UNDECIMBER = 12;
69151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
69251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
69351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Value of the {@link #AM_PM} field indicating the
69451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * period of the day from midnight to just before noon.
69551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
69651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public final static int AM = 0;
69751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
69851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
69951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Value of the {@link #AM_PM} field indicating the
70051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * period of the day from noon to just before midnight.
70151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
70251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public final static int PM = 1;
70351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
70451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
70551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * A style specifier for {@link #getDisplayNames(int, int, Locale)
70651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * getDisplayNames} indicating names in all styles, such as
70751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * "January" and "Jan".
70851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
70951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see #SHORT
71051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see #LONG
71151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @since 1.6
71251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
71351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public static final int ALL_STYLES = 0;
71451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
71551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
71651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * A style specifier for {@link #getDisplayName(int, int, Locale)
71751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * getDisplayName} and {@link #getDisplayNames(int, int, Locale)
71851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * getDisplayNames} indicating a short name, such as "Jan".
71951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
72051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see #LONG
72151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @since 1.6
72251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
72351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public static final int SHORT = 1;
72451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
72551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
72651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * A style specifier for {@link #getDisplayName(int, int, Locale)
72751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * getDisplayName} and {@link #getDisplayNames(int, int, Locale)
72851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * getDisplayNames} indicating a long name, such as "January".
72951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
73051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see #SHORT
73151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @since 1.6
73251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
73351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public static final int LONG = 2;
73451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
73551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    // Internal notes:
73651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    // Calendar contains two kinds of time representations: current "time" in
73751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    // milliseconds, and a set of calendar "fields" representing the current time.
73851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    // The two representations are usually in sync, but can get out of sync
73951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    // as follows.
74051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    // 1. Initially, no fields are set, and the time is invalid.
74151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    // 2. If the time is set, all fields are computed and in sync.
74251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    // 3. If a single field is set, the time is invalid.
74351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    // Recomputation of the time and fields happens when the object needs
74451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    // to return a result to the user, or use a result for a computation.
74551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
74651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
74751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * The calendar field values for the currently set time for this calendar.
74851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * This is an array of <code>FIELD_COUNT</code> integers, with index values
74951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <code>ERA</code> through <code>DST_OFFSET</code>.
75051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @serial
75151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
75251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    protected int           fields[];
75351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
75451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
75551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * The flags which tell if a specified calendar field for the calendar is set.
75651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * A new object has no fields set.  After the first call to a method
75751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * which generates the fields, they all remain set after that.
75851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * This is an array of <code>FIELD_COUNT</code> booleans, with index values
75951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <code>ERA</code> through <code>DST_OFFSET</code>.
76051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @serial
76151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
76251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    protected boolean       isSet[];
76351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
76451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
76551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Pseudo-time-stamps which specify when each field was set. There
76651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * are two special values, UNSET and COMPUTED. Values from
76751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * MINIMUM_USER_SET to Integer.MAX_VALUE are legal user set values.
76851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
76951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    transient private int   stamp[];
77051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
77151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
77251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * The currently set time for this calendar, expressed in milliseconds after
77351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * January 1, 1970, 0:00:00 GMT.
77451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see #isTimeSet
77551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @serial
77651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
77751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    protected long          time;
77851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
77951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
78051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * True if then the value of <code>time</code> is valid.
78151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * The time is made invalid by a change to an item of <code>field[]</code>.
78251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see #time
78351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @serial
78451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
78551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    protected boolean       isTimeSet;
78651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
78751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
78851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * True if <code>fields[]</code> are in sync with the currently set time.
78951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * If false, then the next attempt to get the value of a field will
79051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * force a recomputation of all fields from the current value of
79151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <code>time</code>.
79251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @serial
79351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
79451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    protected boolean       areFieldsSet;
79551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
79651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
79751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * True if all fields have been set.
79851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @serial
79951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
80051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    transient boolean       areAllFieldsSet;
80151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
80251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
80351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <code>True</code> if this calendar allows out-of-range field values during computation
80451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * of <code>time</code> from <code>fields[]</code>.
80551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see #setLenient
80651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see #isLenient
80751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @serial
80851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
80951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    private boolean         lenient = true;
81051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
81151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
81251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * The <code>TimeZone</code> used by this calendar. <code>Calendar</code>
81351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * uses the time zone data to translate between locale and GMT time.
81451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @serial
81551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
81651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    private TimeZone        zone;
81751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
81851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
81951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <code>True</code> if zone references to a shared TimeZone object.
82051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
82151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    transient private boolean sharedZone = false;
82251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
82351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
82451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * The first day of the week, with possible values <code>SUNDAY</code>,
82551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <code>MONDAY</code>, etc.  This is a locale-dependent value.
82651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @serial
82751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
82851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    private int             firstDayOfWeek;
82951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
83051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
83151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * The number of days required for the first week in a month or year,
83251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * with possible values from 1 to 7.  This is a locale-dependent value.
83351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @serial
83451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
83551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    private int             minimalDaysInFirstWeek;
83651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
83751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
83851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Cache to hold the firstDayOfWeek and minimalDaysInFirstWeek
83951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * of a Locale.
84051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
84151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    private static final ConcurrentMap<Locale, int[]> cachedLocaleData
84251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        = new ConcurrentHashMap<Locale, int[]>(3);
84351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
84451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    // Special values of stamp[]
84551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
84651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * The corresponding fields[] has no value.
84751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
84851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    private static final int        UNSET = 0;
84951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
85051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
85151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * The value of the corresponding fields[] has been calculated internally.
85251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
85351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    private static final int        COMPUTED = 1;
85451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
85551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
85651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * The value of the corresponding fields[] has been set externally. Stamp
85751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * values which are greater than 1 represents the (pseudo) time when the
85851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * corresponding fields[] value was set.
85951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
86051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    private static final int        MINIMUM_USER_STAMP = 2;
86151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
86251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
86351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * The mask value that represents all of the fields.
86451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
86551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    static final int ALL_FIELDS = (1 << FIELD_COUNT) - 1;
86651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
86751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
86851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * The next available value for <code>stamp[]</code>, an internal array.
86951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * This actually should not be written out to the stream, and will probably
87051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * be removed from the stream in the near future.  In the meantime,
87151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * a value of <code>MINIMUM_USER_STAMP</code> should be used.
87251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @serial
87351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
87451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    private int             nextStamp = MINIMUM_USER_STAMP;
87551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
87651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    // the internal serial version which says which version was written
87751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    // - 0 (default) for version up to JDK 1.1.5
87851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    // - 1 for version from JDK 1.1.6, which writes a correct 'time' value
87951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    //     as well as compatible values for other fields.  This is a
88051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    //     transitional format.
88151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    // - 2 (not implemented yet) a future version, in which fields[],
88251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    //     areFieldsSet, and isTimeSet become transient, and isSet[] is
88351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    //     removed. In JDK 1.1.6 we write a format compatible with version 2.
88451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    static final int        currentSerialVersion = 1;
88551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
88651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
88751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * The version of the serialized data on the stream.  Possible values:
88851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <dl>
88951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <dt><b>0</b> or not present on stream</dt>
89051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <dd>
89151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * JDK 1.1.5 or earlier.
89251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * </dd>
89351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <dt><b>1</b></dt>
89451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <dd>
89551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * JDK 1.1.6 or later.  Writes a correct 'time' value
89651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * as well as compatible values for other fields.  This is a
89751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * transitional format.
89851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * </dd>
89951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * </dl>
90051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * When streaming out this class, the most recent format
90151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * and the highest allowable <code>serialVersionOnStream</code>
90251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * is written.
90351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @serial
90451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @since JDK1.1.6
90551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
90651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    private int             serialVersionOnStream = currentSerialVersion;
90751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
90851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    // Proclaim serialization compatibility with JDK 1.1
90951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    static final long       serialVersionUID = -1807547505821590642L;
91051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
91151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    // Mask values for calendar fields
91251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    final static int ERA_MASK           = (1 << ERA);
91351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    final static int YEAR_MASK          = (1 << YEAR);
91451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    final static int MONTH_MASK         = (1 << MONTH);
91551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    final static int WEEK_OF_YEAR_MASK  = (1 << WEEK_OF_YEAR);
91651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    final static int WEEK_OF_MONTH_MASK = (1 << WEEK_OF_MONTH);
91751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    final static int DAY_OF_MONTH_MASK  = (1 << DAY_OF_MONTH);
91851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    final static int DATE_MASK          = DAY_OF_MONTH_MASK;
91951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    final static int DAY_OF_YEAR_MASK   = (1 << DAY_OF_YEAR);
92051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    final static int DAY_OF_WEEK_MASK   = (1 << DAY_OF_WEEK);
92151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    final static int DAY_OF_WEEK_IN_MONTH_MASK  = (1 << DAY_OF_WEEK_IN_MONTH);
92251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    final static int AM_PM_MASK         = (1 << AM_PM);
92351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    final static int HOUR_MASK          = (1 << HOUR);
92451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    final static int HOUR_OF_DAY_MASK   = (1 << HOUR_OF_DAY);
92551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    final static int MINUTE_MASK        = (1 << MINUTE);
92651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    final static int SECOND_MASK        = (1 << SECOND);
92751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    final static int MILLISECOND_MASK   = (1 << MILLISECOND);
92851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    final static int ZONE_OFFSET_MASK   = (1 << ZONE_OFFSET);
92951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    final static int DST_OFFSET_MASK    = (1 << DST_OFFSET);
93051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
93151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
93251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Constructs a Calendar with the default time zone
93351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * and locale.
93451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see     TimeZone#getDefault
93551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
93651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    protected Calendar()
93751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    {
93851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        this(TimeZone.getDefaultRef(), Locale.getDefault(Locale.Category.FORMAT));
93951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        sharedZone = true;
94051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
94151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
94251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
94351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Constructs a calendar with the specified time zone and locale.
94451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
94551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param zone the time zone to use
94651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param aLocale the locale for the week data
94751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
94851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    protected Calendar(TimeZone zone, Locale aLocale)
94951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    {
9503f3582d1853c053a9002cd6850ffb40ec7864e4cPaul Duffin        // http://b/16938922.
9513f3582d1853c053a9002cd6850ffb40ec7864e4cPaul Duffin        //
9523f3582d1853c053a9002cd6850ffb40ec7864e4cPaul Duffin        // TODO: This is for backwards compatibility only. Seems like a better idea to throw
9533f3582d1853c053a9002cd6850ffb40ec7864e4cPaul Duffin        // here. We should add a targetSdkVersion based check and throw for this case.
9543f3582d1853c053a9002cd6850ffb40ec7864e4cPaul Duffin        if (aLocale == null) {
9553f3582d1853c053a9002cd6850ffb40ec7864e4cPaul Duffin            aLocale = Locale.getDefault();
9563f3582d1853c053a9002cd6850ffb40ec7864e4cPaul Duffin        }
95751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        fields = new int[FIELD_COUNT];
95851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        isSet = new boolean[FIELD_COUNT];
95951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        stamp = new int[FIELD_COUNT];
96051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
96151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        this.zone = zone;
96251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        setWeekCountData(aLocale);
96351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
96451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
96551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
96651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Gets a calendar using the default time zone and locale. The
96751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <code>Calendar</code> returned is based on the current time
96851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * in the default time zone with the default locale.
96951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
97051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @return a Calendar.
97151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
97251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public static Calendar getInstance()
97351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    {
97451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        Calendar cal = createCalendar(TimeZone.getDefaultRef(), Locale.getDefault(Locale.Category.FORMAT));
97551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        cal.sharedZone = true;
97651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return cal;
97751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
97851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
97951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
98051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Gets a calendar using the specified time zone and default locale.
98151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * The <code>Calendar</code> returned is based on the current time
98251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * in the given time zone with the default locale.
98351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
98451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param zone the time zone to use
98551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @return a Calendar.
98651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
98751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public static Calendar getInstance(TimeZone zone)
98851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    {
98951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return createCalendar(zone, Locale.getDefault(Locale.Category.FORMAT));
99051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
99151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
99251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
99351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Gets a calendar using the default time zone and specified locale.
99451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * The <code>Calendar</code> returned is based on the current time
99551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * in the default time zone with the given locale.
99651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
99751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param aLocale the locale for the week data
99851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @return a Calendar.
99951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
100051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public static Calendar getInstance(Locale aLocale)
100151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    {
100251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        Calendar cal = createCalendar(TimeZone.getDefaultRef(), aLocale);
100351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        cal.sharedZone = true;
100451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return cal;
100551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
100651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
100751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
100851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Gets a calendar with the specified time zone and locale.
100951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * The <code>Calendar</code> returned is based on the current time
101051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * in the given time zone with the given locale.
101151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
101251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param zone the time zone to use
101351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param aLocale the locale for the week data
101451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @return a Calendar.
101551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
101651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public static Calendar getInstance(TimeZone zone,
101751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                                       Locale aLocale)
101851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    {
101951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return createCalendar(zone, aLocale);
102051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
102151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
102251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    private static Calendar createCalendar(TimeZone zone,
102351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                                           Locale aLocale)
102451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    {
10259c853c5b9ebbb0ef60a013ae10ee411d70dfa832Piotr Jastrzebski        return new GregorianCalendar(zone, aLocale);
102651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
102751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
102851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
102951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Returns an array of all locales for which the <code>getInstance</code>
103051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * methods of this class can return localized instances.
103151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * The array returned must contain at least a <code>Locale</code>
103251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * instance equal to {@link java.util.Locale#US Locale.US}.
103351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
103451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @return An array of locales for which localized
103551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *         <code>Calendar</code> instances are available.
103651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
103751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public static synchronized Locale[] getAvailableLocales()
103851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    {
103951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return DateFormat.getAvailableLocales();
104051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
104151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
104251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
104351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Converts the current calendar field values in {@link #fields fields[]}
104451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * to the millisecond time value
104551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * {@link #time}.
104651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
104751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see #complete()
104851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see #computeFields()
104951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
105051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    protected abstract void computeTime();
105151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
105251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
105351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Converts the current millisecond time value {@link #time}
105451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * to calendar field values in {@link #fields fields[]}.
105551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * This allows you to sync up the calendar field values with
105651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * a new time that is set for the calendar.  The time is <em>not</em>
105751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * recomputed first; to recompute the time, then the fields, call the
105851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * {@link #complete()} method.
105951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
106051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see #computeTime()
106151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
106251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    protected abstract void computeFields();
106351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
106451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
106551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Returns a <code>Date</code> object representing this
106651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <code>Calendar</code>'s time value (millisecond offset from the <a
106751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * href="#Epoch">Epoch</a>").
106851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
106951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @return a <code>Date</code> representing the time value.
107051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see #setTime(Date)
107151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see #getTimeInMillis()
107251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
107351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public final Date getTime() {
107451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return new Date(getTimeInMillis());
107551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
107651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
107751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
107851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Sets this Calendar's time with the given <code>Date</code>.
107951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <p>
108051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Note: Calling <code>setTime()</code> with
108151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <code>Date(Long.MAX_VALUE)</code> or <code>Date(Long.MIN_VALUE)</code>
108251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * may yield incorrect field values from <code>get()</code>.
108351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
108451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param date the given Date.
108551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see #getTime()
108651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see #setTimeInMillis(long)
108751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
108851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public final void setTime(Date date) {
108951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        setTimeInMillis(date.getTime());
109051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
109151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
109251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
109351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Returns this Calendar's time value in milliseconds.
109451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
109551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @return the current time as UTC milliseconds from the epoch.
109651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see #getTime()
109751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see #setTimeInMillis(long)
109851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
109951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public long getTimeInMillis() {
110051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if (!isTimeSet) {
110151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            updateTime();
110251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
110351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return time;
110451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
110551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
110651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
110751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Sets this Calendar's current time from the given long value.
110851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
110951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param millis the new time in UTC milliseconds from the epoch.
111051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see #setTime(Date)
111151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see #getTimeInMillis()
111251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
111351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public void setTimeInMillis(long millis) {
111451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        // If we don't need to recalculate the calendar field values,
111551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        // do nothing.
11169c853c5b9ebbb0ef60a013ae10ee411d70dfa832Piotr Jastrzebski        if (time == millis && isTimeSet && areFieldsSet && areAllFieldsSet) {
111751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            return;
111851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
111951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        time = millis;
112051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        isTimeSet = true;
112151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        areFieldsSet = false;
112251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        computeFields();
112351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        areAllFieldsSet = areFieldsSet = true;
112451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
112551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
112651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
112751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Returns the value of the given calendar field. In lenient mode,
112851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * all calendar fields are normalized. In non-lenient mode, all
112951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * calendar fields are validated and this method throws an
113051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * exception if any calendar fields have out-of-range values. The
113151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * normalization and validation are handled by the
113251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * {@link #complete()} method, which process is calendar
113351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * system dependent.
113451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
113551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param field the given calendar field.
113651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @return the value for the given calendar field.
113751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @throws ArrayIndexOutOfBoundsException if the specified field is out of range
113851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *             (<code>field &lt; 0 || field &gt;= FIELD_COUNT</code>).
113951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see #set(int,int)
114051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see #complete()
114151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
114251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public int get(int field)
114351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    {
114451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        complete();
114551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return internalGet(field);
114651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
114751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
114851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
114951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Returns the value of the given calendar field. This method does
115051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * not involve normalization or validation of the field value.
115151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
115251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param field the given calendar field.
115351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @return the value for the given calendar field.
115451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see #get(int)
115551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
115651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    protected final int internalGet(int field)
115751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    {
115851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return fields[field];
115951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
116051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
116151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
116251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Sets the value of the given calendar field. This method does
116351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * not affect any setting state of the field in this
116451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <code>Calendar</code> instance.
116551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
116651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @throws IndexOutOfBoundsException if the specified field is out of range
116751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *             (<code>field &lt; 0 || field &gt;= FIELD_COUNT</code>).
116851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see #areFieldsSet
116951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see #isTimeSet
117051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see #areAllFieldsSet
117151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see #set(int,int)
117251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
117351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    final void internalSet(int field, int value)
117451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    {
117551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        fields[field] = value;
117651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
117751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
117851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
117951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Sets the given calendar field to the given value. The value is not
118051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * interpreted by this method regardless of the leniency mode.
118151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
118251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param field the given calendar field.
118351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param value the value to be set for the given calendar field.
118451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @throws ArrayIndexOutOfBoundsException if the specified field is out of range
118551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *             (<code>field &lt; 0 || field &gt;= FIELD_COUNT</code>).
118651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * in non-lenient mode.
118751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see #set(int,int,int)
118851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see #set(int,int,int,int,int)
118951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see #set(int,int,int,int,int,int)
119051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see #get(int)
119151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
119251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public void set(int field, int value)
119351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    {
119451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        // If the fields are partially normalized, calculate all the
119551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        // fields before changing any fields.
119651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if (areFieldsSet && !areAllFieldsSet) {
119751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            computeFields();
119851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
119951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        internalSet(field, value);
120051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        isTimeSet = false;
120151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        areFieldsSet = false;
120251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        isSet[field] = true;
120351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        stamp[field] = nextStamp++;
120451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if (nextStamp == Integer.MAX_VALUE) {
120551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            adjustStamp();
120651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
120751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
120851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
120951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
121051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Sets the values for the calendar fields <code>YEAR</code>,
121151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <code>MONTH</code>, and <code>DAY_OF_MONTH</code>.
121251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Previous values of other calendar fields are retained.  If this is not desired,
121351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * call {@link #clear()} first.
121451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
121551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param year the value used to set the <code>YEAR</code> calendar field.
121651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param month the value used to set the <code>MONTH</code> calendar field.
121751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Month value is 0-based. e.g., 0 for January.
121851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param date the value used to set the <code>DAY_OF_MONTH</code> calendar field.
121951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see #set(int,int)
122051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see #set(int,int,int,int,int)
122151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see #set(int,int,int,int,int,int)
122251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
122351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public final void set(int year, int month, int date)
122451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    {
122551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        set(YEAR, year);
122651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        set(MONTH, month);
122751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        set(DATE, date);
122851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
122951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
123051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
123151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Sets the values for the calendar fields <code>YEAR</code>,
123251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <code>MONTH</code>, <code>DAY_OF_MONTH</code>,
123351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <code>HOUR_OF_DAY</code>, and <code>MINUTE</code>.
123451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Previous values of other fields are retained.  If this is not desired,
123551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * call {@link #clear()} first.
123651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
123751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param year the value used to set the <code>YEAR</code> calendar field.
123851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param month the value used to set the <code>MONTH</code> calendar field.
123951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Month value is 0-based. e.g., 0 for January.
124051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param date the value used to set the <code>DAY_OF_MONTH</code> calendar field.
124151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param hourOfDay the value used to set the <code>HOUR_OF_DAY</code> calendar field.
124251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param minute the value used to set the <code>MINUTE</code> calendar field.
124351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see #set(int,int)
124451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see #set(int,int,int)
124551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see #set(int,int,int,int,int,int)
124651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
124751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public final void set(int year, int month, int date, int hourOfDay, int minute)
124851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    {
124951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        set(YEAR, year);
125051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        set(MONTH, month);
125151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        set(DATE, date);
125251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        set(HOUR_OF_DAY, hourOfDay);
125351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        set(MINUTE, minute);
125451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
125551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
125651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
125751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Sets the values for the fields <code>YEAR</code>, <code>MONTH</code>,
125851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <code>DAY_OF_MONTH</code>, <code>HOUR</code>, <code>MINUTE</code>, and
125951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <code>SECOND</code>.
126051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Previous values of other fields are retained.  If this is not desired,
126151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * call {@link #clear()} first.
126251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
126351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param year the value used to set the <code>YEAR</code> calendar field.
126451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param month the value used to set the <code>MONTH</code> calendar field.
126551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Month value is 0-based. e.g., 0 for January.
126651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param date the value used to set the <code>DAY_OF_MONTH</code> calendar field.
126751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param hourOfDay the value used to set the <code>HOUR_OF_DAY</code> calendar field.
126851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param minute the value used to set the <code>MINUTE</code> calendar field.
126951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param second the value used to set the <code>SECOND</code> calendar field.
127051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see #set(int,int)
127151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see #set(int,int,int)
127251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see #set(int,int,int,int,int)
127351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
127451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public final void set(int year, int month, int date, int hourOfDay, int minute,
127551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                          int second)
127651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    {
127751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        set(YEAR, year);
127851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        set(MONTH, month);
127951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        set(DATE, date);
128051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        set(HOUR_OF_DAY, hourOfDay);
128151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        set(MINUTE, minute);
128251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        set(SECOND, second);
128351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
128451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
128551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
128651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Sets all the calendar field values and the time value
128751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * (millisecond offset from the <a href="#Epoch">Epoch</a>) of
128851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * this <code>Calendar</code> undefined. This means that {@link
128951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * #isSet(int) isSet()} will return <code>false</code> for all the
129051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * calendar fields, and the date and time calculations will treat
129151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * the fields as if they had never been set. A
129251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <code>Calendar</code> implementation class may use its specific
129351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * default field values for date/time calculations. For example,
129451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <code>GregorianCalendar</code> uses 1970 if the
129551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <code>YEAR</code> field value is undefined.
129651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
129751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see #clear(int)
129851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
129951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public final void clear()
130051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    {
130151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        for (int i = 0; i < fields.length; ) {
130251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            stamp[i] = fields[i] = 0; // UNSET == 0
130351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            isSet[i++] = false;
130451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
130551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        areAllFieldsSet = areFieldsSet = false;
130651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        isTimeSet = false;
130751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
130851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
130951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
131051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Sets the given calendar field value and the time value
131151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * (millisecond offset from the <a href="#Epoch">Epoch</a>) of
131251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * this <code>Calendar</code> undefined. This means that {@link
131351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * #isSet(int) isSet(field)} will return <code>false</code>, and
131451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * the date and time calculations will treat the field as if it
131551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * had never been set. A <code>Calendar</code> implementation
131651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * class may use the field's specific default value for date and
131751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * time calculations.
131851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
131951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <p>The {@link #HOUR_OF_DAY}, {@link #HOUR} and {@link #AM_PM}
132051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * fields are handled independently and the <a
132151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * href="#time_resolution">the resolution rule for the time of
132251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * day</a> is applied. Clearing one of the fields doesn't reset
132351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * the hour of day value of this <code>Calendar</code>. Use {@link
132451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * #set(int,int) set(Calendar.HOUR_OF_DAY, 0)} to reset the hour
132551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * value.
132651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
132751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param field the calendar field to be cleared.
132851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see #clear()
132951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
133051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public final void clear(int field)
133151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    {
133251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        fields[field] = 0;
133351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        stamp[field] = UNSET;
133451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        isSet[field] = false;
133551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
133651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        areAllFieldsSet = areFieldsSet = false;
133751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        isTimeSet = false;
133851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
133951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
134051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
134151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Determines if the given calendar field has a value set,
134251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * including cases that the value has been set by internal fields
134351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * calculations triggered by a <code>get</code> method call.
134451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
134551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @return <code>true</code> if the given calendar field has a value set;
134651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <code>false</code> otherwise.
134751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
134851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public final boolean isSet(int field)
134951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    {
135051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return stamp[field] != UNSET;
135151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
135251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
135351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
135451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Returns the string representation of the calendar
135551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <code>field</code> value in the given <code>style</code> and
135651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <code>locale</code>.  If no string representation is
135751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * applicable, <code>null</code> is returned. This method calls
135851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * {@link Calendar#get(int) get(field)} to get the calendar
135951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <code>field</code> value if the string representation is
136051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * applicable to the given calendar <code>field</code>.
136151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
136251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <p>For example, if this <code>Calendar</code> is a
136351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <code>GregorianCalendar</code> and its date is 2005-01-01, then
136451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * the string representation of the {@link #MONTH} field would be
136551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * "January" in the long style in an English locale or "Jan" in
136651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * the short style. However, no string representation would be
136751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * available for the {@link #DAY_OF_MONTH} field, and this method
136851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * would return <code>null</code>.
136951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
137051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <p>The default implementation supports the calendar fields for
137151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * which a {@link DateFormatSymbols} has names in the given
137251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <code>locale</code>.
137351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
137451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param field
137551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *        the calendar field for which the string representation
137651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *        is returned
137751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param style
137851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *        the style applied to the string representation; one of
137951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *        {@link #SHORT} or {@link #LONG}.
138051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param locale
138151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *        the locale for the string representation
138251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @return the string representation of the given
138351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *        <code>field</code> in the given <code>style</code>, or
138451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *        <code>null</code> if no string representation is
138551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *        applicable.
138651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @exception IllegalArgumentException
138751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *        if <code>field</code> or <code>style</code> is invalid,
138851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *        or if this <code>Calendar</code> is non-lenient and any
138951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *        of the calendar fields have invalid values
139051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @exception NullPointerException
139151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *        if <code>locale</code> is null
139251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @since 1.6
139351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
139451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public String getDisplayName(int field, int style, Locale locale) {
139551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if (!checkDisplayNameParams(field, style, ALL_STYLES, LONG, locale,
139651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                                    ERA_MASK|MONTH_MASK|DAY_OF_WEEK_MASK|AM_PM_MASK)) {
139751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            return null;
139851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
139951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
140051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        DateFormatSymbols symbols = DateFormatSymbols.getInstance(locale);
140151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        String[] strings = getFieldStrings(field, style, symbols);
140251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if (strings != null) {
140351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            int fieldValue = get(field);
140451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            if (fieldValue < strings.length) {
140551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                return strings[fieldValue];
140651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            }
140751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
140851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return null;
140951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
141051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
141151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
141251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Returns a <code>Map</code> containing all names of the calendar
141351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <code>field</code> in the given <code>style</code> and
141451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <code>locale</code> and their corresponding field values. For
141551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * example, if this <code>Calendar</code> is a {@link
141651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * GregorianCalendar}, the returned map would contain "Jan" to
141751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * {@link #JANUARY}, "Feb" to {@link #FEBRUARY}, and so on, in the
141851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * {@linkplain #SHORT short} style in an English locale.
141951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
142051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <p>The values of other calendar fields may be taken into
142151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * account to determine a set of display names. For example, if
142251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * this <code>Calendar</code> is a lunisolar calendar system and
142351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * the year value given by the {@link #YEAR} field has a leap
142451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * month, this method would return month names containing the leap
142551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * month name, and month names are mapped to their values specific
142651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * for the year.
142751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
142851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <p>The default implementation supports display names contained in
142951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * a {@link DateFormatSymbols}. For example, if <code>field</code>
143051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * is {@link #MONTH} and <code>style</code> is {@link
143151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * #ALL_STYLES}, this method returns a <code>Map</code> containing
143251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * all strings returned by {@link DateFormatSymbols#getShortMonths()}
143351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * and {@link DateFormatSymbols#getMonths()}.
143451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
143551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param field
143651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *        the calendar field for which the display names are returned
143751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param style
143851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *        the style applied to the display names; one of {@link
143951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *        #SHORT}, {@link #LONG}, or {@link #ALL_STYLES}.
144051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param locale
144151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *        the locale for the display names
144251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @return a <code>Map</code> containing all display names in
144351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *        <code>style</code> and <code>locale</code> and their
144451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *        field values, or <code>null</code> if no display names
144551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *        are defined for <code>field</code>
144651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @exception IllegalArgumentException
144751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *        if <code>field</code> or <code>style</code> is invalid,
144851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *        or if this <code>Calendar</code> is non-lenient and any
144951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *        of the calendar fields have invalid values
145051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @exception NullPointerException
145151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *        if <code>locale</code> is null
145251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @since 1.6
145351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
145451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public Map<String, Integer> getDisplayNames(int field, int style, Locale locale) {
145551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if (!checkDisplayNameParams(field, style, ALL_STYLES, LONG, locale,
145651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                                    ERA_MASK|MONTH_MASK|DAY_OF_WEEK_MASK|AM_PM_MASK)) {
145751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            return null;
145851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
14597e2649e490f1da8c6c859a6c76d2199e1d9fb516Yi Kong        complete();
146051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
146151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        // ALL_STYLES
146251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if (style == ALL_STYLES) {
146351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            Map<String,Integer> shortNames = getDisplayNamesImpl(field, SHORT, locale);
146451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            if (field == ERA || field == AM_PM) {
146551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                return shortNames;
146651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            }
146751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            Map<String,Integer> longNames = getDisplayNamesImpl(field, LONG, locale);
146851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            if (shortNames == null) {
146951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                return longNames;
147051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            }
147151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            if (longNames != null) {
147251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                shortNames.putAll(longNames);
147351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            }
147451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            return shortNames;
147551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
147651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
147751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        // SHORT or LONG
147851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return getDisplayNamesImpl(field, style, locale);
147951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
148051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
148151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    private Map<String,Integer> getDisplayNamesImpl(int field, int style, Locale locale) {
148251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        DateFormatSymbols symbols = DateFormatSymbols.getInstance(locale);
148351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        String[] strings = getFieldStrings(field, style, symbols);
148451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if (strings != null) {
148551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            Map<String,Integer> names = new HashMap<String,Integer>();
148651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            for (int i = 0; i < strings.length; i++) {
148751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                if (strings[i].length() == 0) {
148851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                    continue;
148951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                }
149051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                names.put(strings[i], i);
149151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            }
149251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            return names;
149351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
149451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return null;
149551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
149651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
149751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    boolean checkDisplayNameParams(int field, int style, int minStyle, int maxStyle,
149851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                                   Locale locale, int fieldMask) {
149951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if (field < 0 || field >= fields.length ||
150051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            style < minStyle || style > maxStyle) {
150151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            throw new IllegalArgumentException();
150251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
150351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if (locale == null) {
150451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            throw new NullPointerException();
150551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
150651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return isFieldSet(fieldMask, field);
150751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
150851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
150951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    private String[] getFieldStrings(int field, int style, DateFormatSymbols symbols) {
151051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        String[] strings = null;
151151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        switch (field) {
151251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        case ERA:
151351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            strings = symbols.getEras();
151451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            break;
151551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
151651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        case MONTH:
151751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            strings = (style == LONG) ? symbols.getMonths() : symbols.getShortMonths();
151851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            break;
151951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
152051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        case DAY_OF_WEEK:
152151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            strings = (style == LONG) ? symbols.getWeekdays() : symbols.getShortWeekdays();
152251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            break;
152351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
152451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        case AM_PM:
152551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            strings = symbols.getAmPmStrings();
152651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            break;
152751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
152851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return strings;
152951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
153051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
153151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
153251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Fills in any unset fields in the calendar fields. First, the {@link
153351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * #computeTime()} method is called if the time value (millisecond offset
153451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * from the <a href="#Epoch">Epoch</a>) has not been calculated from
153551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * calendar field values. Then, the {@link #computeFields()} method is
153651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * called to calculate all calendar field values.
153751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
153851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    protected void complete()
153951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    {
154051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if (!isTimeSet)
154151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            updateTime();
154251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if (!areFieldsSet || !areAllFieldsSet) {
154351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            computeFields(); // fills in unset fields
154451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            areAllFieldsSet = areFieldsSet = true;
154551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
154651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
154751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
154851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
154951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Returns whether the value of the specified calendar field has been set
155051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * externally by calling one of the setter methods rather than by the
155151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * internal time calculation.
155251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
155351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @return <code>true</code> if the field has been set externally,
155451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <code>false</code> otherwise.
155551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @exception IndexOutOfBoundsException if the specified
155651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *                <code>field</code> is out of range
155751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *               (<code>field &lt; 0 || field &gt;= FIELD_COUNT</code>).
155851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see #selectFields()
155951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see #setFieldsComputed(int)
156051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
156151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    final boolean isExternallySet(int field) {
156251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return stamp[field] >= MINIMUM_USER_STAMP;
156351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
156451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
156551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
156651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Returns a field mask (bit mask) indicating all calendar fields that
156751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * have the state of externally or internally set.
156851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
156951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @return a bit mask indicating set state fields
157051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
157151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    final int getSetStateFields() {
157251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        int mask = 0;
157351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        for (int i = 0; i < fields.length; i++) {
157451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            if (stamp[i] != UNSET) {
157551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                mask |= 1 << i;
157651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            }
157751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
157851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return mask;
157951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
158051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
158151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
158251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Sets the state of the specified calendar fields to
158351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <em>computed</em>. This state means that the specified calendar fields
158451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * have valid values that have been set by internal time calculation
158551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * rather than by calling one of the setter methods.
158651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
158751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param fieldMask the field to be marked as computed.
158851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @exception IndexOutOfBoundsException if the specified
158951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *                <code>field</code> is out of range
159051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *               (<code>field &lt; 0 || field &gt;= FIELD_COUNT</code>).
159151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see #isExternallySet(int)
159251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see #selectFields()
159351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
159451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    final void setFieldsComputed(int fieldMask) {
159551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if (fieldMask == ALL_FIELDS) {
159651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            for (int i = 0; i < fields.length; i++) {
159751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                stamp[i] = COMPUTED;
159851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                isSet[i] = true;
159951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            }
160051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            areFieldsSet = areAllFieldsSet = true;
160151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        } else {
160251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            for (int i = 0; i < fields.length; i++) {
160351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                if ((fieldMask & 1) == 1) {
160451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                    stamp[i] = COMPUTED;
160551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                    isSet[i] = true;
160651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                } else {
160751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                    if (areAllFieldsSet && !isSet[i]) {
160851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                        areAllFieldsSet = false;
160951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                    }
161051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                }
161151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                fieldMask >>>= 1;
161251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            }
161351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
161451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
161551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
161651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
161751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Sets the state of the calendar fields that are <em>not</em> specified
161851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * by <code>fieldMask</code> to <em>unset</em>. If <code>fieldMask</code>
161951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * specifies all the calendar fields, then the state of this
162051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <code>Calendar</code> becomes that all the calendar fields are in sync
162151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * with the time value (millisecond offset from the Epoch).
162251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
162351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param fieldMask the field mask indicating which calendar fields are in
162451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * sync with the time value.
162551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @exception IndexOutOfBoundsException if the specified
162651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *                <code>field</code> is out of range
162751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *               (<code>field &lt; 0 || field &gt;= FIELD_COUNT</code>).
162851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see #isExternallySet(int)
162951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see #selectFields()
163051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
163151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    final void setFieldsNormalized(int fieldMask) {
163251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if (fieldMask != ALL_FIELDS) {
163351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            for (int i = 0; i < fields.length; i++) {
163451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                if ((fieldMask & 1) == 0) {
163551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                    stamp[i] = fields[i] = 0; // UNSET == 0
163651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                    isSet[i] = false;
163751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                }
163851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                fieldMask >>= 1;
163951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            }
164051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
164151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
164251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        // Some or all of the fields are in sync with the
164351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        // milliseconds, but the stamp values are not normalized yet.
164451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        areFieldsSet = true;
164551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        areAllFieldsSet = false;
164651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
164751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
164851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
164951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Returns whether the calendar fields are partially in sync with the time
165051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * value or fully in sync but not stamp values are not normalized yet.
165151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
165251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    final boolean isPartiallyNormalized() {
165351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return areFieldsSet && !areAllFieldsSet;
165451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
165551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
165651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
165751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Returns whether the calendar fields are fully in sync with the time
165851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * value.
165951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
166051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    final boolean isFullyNormalized() {
166151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return areFieldsSet && areAllFieldsSet;
166251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
166351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
166451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
166551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Marks this Calendar as not sync'd.
166651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
166751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    final void setUnnormalized() {
166851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        areFieldsSet = areAllFieldsSet = false;
166951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
167051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
167151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
167251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Returns whether the specified <code>field</code> is on in the
167351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <code>fieldMask</code>.
167451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
167551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    static final boolean isFieldSet(int fieldMask, int field) {
167651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return (fieldMask & (1 << field)) != 0;
167751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
167851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
167951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
168051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Returns a field mask indicating which calendar field values
168151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * to be used to calculate the time value. The calendar fields are
168251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * returned as a bit mask, each bit of which corresponds to a field, i.e.,
168351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * the mask value of <code>field</code> is <code>(1 &lt;&lt;
168451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * field)</code>. For example, 0x26 represents the <code>YEAR</code>,
168551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <code>MONTH</code>, and <code>DAY_OF_MONTH</code> fields (i.e., 0x26 is
168651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * equal to
168751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <code>(1&lt;&lt;YEAR)|(1&lt;&lt;MONTH)|(1&lt;&lt;DAY_OF_MONTH))</code>.
168851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
168951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <p>This method supports the calendar fields resolution as described in
169051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * the class description. If the bit mask for a given field is on and its
169151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * field has not been set (i.e., <code>isSet(field)</code> is
169251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <code>false</code>), then the default value of the field has to be
169351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * used, which case means that the field has been selected because the
169451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * selected combination involves the field.
169551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
169651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @return a bit mask of selected fields
169751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see #isExternallySet(int)
169851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see #setInternallySetState(int)
169951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
170051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    final int selectFields() {
170151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        // This implementation has been taken from the GregorianCalendar class.
170251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
170351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        // The YEAR field must always be used regardless of its SET
170451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        // state because YEAR is a mandatory field to determine the date
170551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        // and the default value (EPOCH_YEAR) may change through the
170651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        // normalization process.
170751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        int fieldMask = YEAR_MASK;
170851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
170951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if (stamp[ERA] != UNSET) {
171051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            fieldMask |= ERA_MASK;
171151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
171251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        // Find the most recent group of fields specifying the day within
171351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        // the year.  These may be any of the following combinations:
171451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        //   MONTH + DAY_OF_MONTH
171551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        //   MONTH + WEEK_OF_MONTH + DAY_OF_WEEK
171651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        //   MONTH + DAY_OF_WEEK_IN_MONTH + DAY_OF_WEEK
171751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        //   DAY_OF_YEAR
171851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        //   WEEK_OF_YEAR + DAY_OF_WEEK
171951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        // We look for the most recent of the fields in each group to determine
172051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        // the age of the group.  For groups involving a week-related field such
172151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        // as WEEK_OF_MONTH, DAY_OF_WEEK_IN_MONTH, or WEEK_OF_YEAR, both the
172251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        // week-related field and the DAY_OF_WEEK must be set for the group as a
172351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        // whole to be considered.  (See bug 4153860 - liu 7/24/98.)
172451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        int dowStamp = stamp[DAY_OF_WEEK];
172551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        int monthStamp = stamp[MONTH];
172651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        int domStamp = stamp[DAY_OF_MONTH];
172751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        int womStamp = aggregateStamp(stamp[WEEK_OF_MONTH], dowStamp);
172851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        int dowimStamp = aggregateStamp(stamp[DAY_OF_WEEK_IN_MONTH], dowStamp);
172951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        int doyStamp = stamp[DAY_OF_YEAR];
173051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        int woyStamp = aggregateStamp(stamp[WEEK_OF_YEAR], dowStamp);
173151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
173251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        int bestStamp = domStamp;
173351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if (womStamp > bestStamp) {
173451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            bestStamp = womStamp;
173551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
173651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if (dowimStamp > bestStamp) {
173751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            bestStamp = dowimStamp;
173851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
173951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if (doyStamp > bestStamp) {
174051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            bestStamp = doyStamp;
174151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
174251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if (woyStamp > bestStamp) {
174351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            bestStamp = woyStamp;
174451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
174551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
174651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        /* No complete combination exists.  Look for WEEK_OF_MONTH,
174751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski         * DAY_OF_WEEK_IN_MONTH, or WEEK_OF_YEAR alone.  Treat DAY_OF_WEEK alone
174851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski         * as DAY_OF_WEEK_IN_MONTH.
174951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski         */
175051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if (bestStamp == UNSET) {
175151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            womStamp = stamp[WEEK_OF_MONTH];
175251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            dowimStamp = Math.max(stamp[DAY_OF_WEEK_IN_MONTH], dowStamp);
175351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            woyStamp = stamp[WEEK_OF_YEAR];
175451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            bestStamp = Math.max(Math.max(womStamp, dowimStamp), woyStamp);
175551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
175651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            /* Treat MONTH alone or no fields at all as DAY_OF_MONTH.  This may
175751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski             * result in bestStamp = domStamp = UNSET if no fields are set,
175851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski             * which indicates DAY_OF_MONTH.
175951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski             */
176051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            if (bestStamp == UNSET) {
176151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                bestStamp = domStamp = monthStamp;
176251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            }
176351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
176451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
176551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if (bestStamp == domStamp ||
176651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski           (bestStamp == womStamp && stamp[WEEK_OF_MONTH] >= stamp[WEEK_OF_YEAR]) ||
176751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski           (bestStamp == dowimStamp && stamp[DAY_OF_WEEK_IN_MONTH] >= stamp[WEEK_OF_YEAR])) {
176851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            fieldMask |= MONTH_MASK;
176951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            if (bestStamp == domStamp) {
177051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                fieldMask |= DAY_OF_MONTH_MASK;
177151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            } else {
177251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                assert (bestStamp == womStamp || bestStamp == dowimStamp);
177351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                if (dowStamp != UNSET) {
177451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                    fieldMask |= DAY_OF_WEEK_MASK;
177551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                }
177651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                if (womStamp == dowimStamp) {
177751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                    // When they are equal, give the priority to
177851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                    // WEEK_OF_MONTH for compatibility.
177951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                    if (stamp[WEEK_OF_MONTH] >= stamp[DAY_OF_WEEK_IN_MONTH]) {
178051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                        fieldMask |= WEEK_OF_MONTH_MASK;
178151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                    } else {
178251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                        fieldMask |= DAY_OF_WEEK_IN_MONTH_MASK;
178351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                    }
178451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                } else {
178551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                    if (bestStamp == womStamp) {
178651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                        fieldMask |= WEEK_OF_MONTH_MASK;
178751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                    } else {
178851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                        assert (bestStamp == dowimStamp);
178951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                        if (stamp[DAY_OF_WEEK_IN_MONTH] != UNSET) {
179051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                            fieldMask |= DAY_OF_WEEK_IN_MONTH_MASK;
179151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                        }
179251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                    }
179351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                }
179451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            }
179551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        } else {
179651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            assert (bestStamp == doyStamp || bestStamp == woyStamp ||
179751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                    bestStamp == UNSET);
179851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            if (bestStamp == doyStamp) {
179951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                fieldMask |= DAY_OF_YEAR_MASK;
180051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            } else {
180151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                assert (bestStamp == woyStamp);
180251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                if (dowStamp != UNSET) {
180351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                    fieldMask |= DAY_OF_WEEK_MASK;
180451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                }
180551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                fieldMask |= WEEK_OF_YEAR_MASK;
180651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            }
180751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
180851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
180951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        // Find the best set of fields specifying the time of day.  There
181051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        // are only two possibilities here; the HOUR_OF_DAY or the
181151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        // AM_PM and the HOUR.
181251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        int hourOfDayStamp = stamp[HOUR_OF_DAY];
181351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        int hourStamp = aggregateStamp(stamp[HOUR], stamp[AM_PM]);
181451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        bestStamp = (hourStamp > hourOfDayStamp) ? hourStamp : hourOfDayStamp;
181551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
181651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        // if bestStamp is still UNSET, then take HOUR or AM_PM. (See 4846659)
181751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if (bestStamp == UNSET) {
181851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            bestStamp = Math.max(stamp[HOUR], stamp[AM_PM]);
181951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
182051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
182151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        // Hours
182251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if (bestStamp != UNSET) {
182351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            if (bestStamp == hourOfDayStamp) {
182451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                fieldMask |= HOUR_OF_DAY_MASK;
182551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            } else {
182651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                fieldMask |= HOUR_MASK;
182751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                if (stamp[AM_PM] != UNSET) {
182851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                    fieldMask |= AM_PM_MASK;
182951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                }
183051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            }
183151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
183251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if (stamp[MINUTE] != UNSET) {
183351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            fieldMask |= MINUTE_MASK;
183451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
183551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if (stamp[SECOND] != UNSET) {
183651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            fieldMask |= SECOND_MASK;
183751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
183851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if (stamp[MILLISECOND] != UNSET) {
183951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            fieldMask |= MILLISECOND_MASK;
184051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
184151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if (stamp[ZONE_OFFSET] >= MINIMUM_USER_STAMP) {
184251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                fieldMask |= ZONE_OFFSET_MASK;
184351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
184451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if (stamp[DST_OFFSET] >= MINIMUM_USER_STAMP) {
184551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            fieldMask |= DST_OFFSET_MASK;
184651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
184751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
184851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return fieldMask;
184951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
185051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
185151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
185251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Returns the pseudo-time-stamp for two fields, given their
185351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * individual pseudo-time-stamps.  If either of the fields
185451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * is unset, then the aggregate is unset.  Otherwise, the
185551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * aggregate is the later of the two stamps.
185651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
185751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    private static final int aggregateStamp(int stamp_a, int stamp_b) {
185851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if (stamp_a == UNSET || stamp_b == UNSET) {
185951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            return UNSET;
186051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
186151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return (stamp_a > stamp_b) ? stamp_a : stamp_b;
186251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
186351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
186451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
186551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Compares this <code>Calendar</code> to the specified
186651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <code>Object</code>.  The result is <code>true</code> if and only if
186751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * the argument is a <code>Calendar</code> object of the same calendar
186851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * system that represents the same time value (millisecond offset from the
186951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <a href="#Epoch">Epoch</a>) under the same
187051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <code>Calendar</code> parameters as this object.
187151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
187251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <p>The <code>Calendar</code> parameters are the values represented
187351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * by the <code>isLenient</code>, <code>getFirstDayOfWeek</code>,
187451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <code>getMinimalDaysInFirstWeek</code> and <code>getTimeZone</code>
187551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * methods. If there is any difference in those parameters
187651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * between the two <code>Calendar</code>s, this method returns
187751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <code>false</code>.
187851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
187951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <p>Use the {@link #compareTo(Calendar) compareTo} method to
188051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * compare only the time values.
188151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
188251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param obj the object to compare with.
188351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @return <code>true</code> if this object is equal to <code>obj</code>;
188451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <code>false</code> otherwise.
188551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
188651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public boolean equals(Object obj) {
188751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if (this == obj)
188851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            return true;
188951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        try {
189051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            Calendar that = (Calendar)obj;
189151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            return compareTo(getMillisOf(that)) == 0 &&
189251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                lenient == that.lenient &&
189351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                firstDayOfWeek == that.firstDayOfWeek &&
189451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                minimalDaysInFirstWeek == that.minimalDaysInFirstWeek &&
189551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                zone.equals(that.zone);
189651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        } catch (Exception e) {
189751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            // Note: GregorianCalendar.computeTime throws
189851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            // IllegalArgumentException if the ERA value is invalid
189951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            // even it's in lenient mode.
190051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
190151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return false;
190251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
190351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
190451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
190551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Returns a hash code for this calendar.
190651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
190751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @return a hash code value for this object.
190851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @since 1.2
190951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
191051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public int hashCode() {
191151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        // 'otheritems' represents the hash code for the previous versions.
191251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        int otheritems = (lenient ? 1 : 0)
191351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            | (firstDayOfWeek << 1)
191451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            | (minimalDaysInFirstWeek << 4)
191551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            | (zone.hashCode() << 7);
191651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        long t = getMillisOf(this);
191751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return (int) t ^ (int)(t >> 32) ^ otheritems;
191851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
191951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
192051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
192151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Returns whether this <code>Calendar</code> represents a time
192251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * before the time represented by the specified
192351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <code>Object</code>. This method is equivalent to:
192451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <pre><blockquote>
192551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *         compareTo(when) < 0
192651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * </blockquote></pre>
192751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * if and only if <code>when</code> is a <code>Calendar</code>
192851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * instance. Otherwise, the method returns <code>false</code>.
192951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
193051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param when the <code>Object</code> to be compared
193151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @return <code>true</code> if the time of this
193251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <code>Calendar</code> is before the time represented by
193351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <code>when</code>; <code>false</code> otherwise.
193451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see     #compareTo(Calendar)
193551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
193651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public boolean before(Object when) {
193751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return when instanceof Calendar
193851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            && compareTo((Calendar)when) < 0;
193951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
194051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
194151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
194251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Returns whether this <code>Calendar</code> represents a time
194351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * after the time represented by the specified
194451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <code>Object</code>. This method is equivalent to:
194551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <pre><blockquote>
194651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *         compareTo(when) > 0
194751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * </blockquote></pre>
194851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * if and only if <code>when</code> is a <code>Calendar</code>
194951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * instance. Otherwise, the method returns <code>false</code>.
195051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
195151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param when the <code>Object</code> to be compared
195251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @return <code>true</code> if the time of this <code>Calendar</code> is
195351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * after the time represented by <code>when</code>; <code>false</code>
195451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * otherwise.
195551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see     #compareTo(Calendar)
195651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
195751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public boolean after(Object when) {
195851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return when instanceof Calendar
195951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            && compareTo((Calendar)when) > 0;
196051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
196151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
196251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
196351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Compares the time values (millisecond offsets from the <a
196451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * href="#Epoch">Epoch</a>) represented by two
196551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <code>Calendar</code> objects.
196651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
196751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param anotherCalendar the <code>Calendar</code> to be compared.
196851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @return the value <code>0</code> if the time represented by the argument
196951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * is equal to the time represented by this <code>Calendar</code>; a value
197051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * less than <code>0</code> if the time of this <code>Calendar</code> is
197151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * before the time represented by the argument; and a value greater than
197251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <code>0</code> if the time of this <code>Calendar</code> is after the
197351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * time represented by the argument.
197451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @exception NullPointerException if the specified <code>Calendar</code> is
197551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *            <code>null</code>.
197651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @exception IllegalArgumentException if the time value of the
197751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * specified <code>Calendar</code> object can't be obtained due to
197851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * any invalid calendar values.
197951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @since   1.5
198051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
198151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public int compareTo(Calendar anotherCalendar) {
198251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return compareTo(getMillisOf(anotherCalendar));
198351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
198451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
198551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
198651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Adds or subtracts the specified amount of time to the given calendar field,
198751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * based on the calendar's rules. For example, to subtract 5 days from
198851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * the current time of the calendar, you can achieve it by calling:
198951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <p><code>add(Calendar.DAY_OF_MONTH, -5)</code>.
199051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
199151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param field the calendar field.
199251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param amount the amount of date or time to be added to the field.
199351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see #roll(int,int)
199451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see #set(int,int)
199551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
199651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    abstract public void add(int field, int amount);
199751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
199851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
199951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Adds or subtracts (up/down) a single unit of time on the given time
200051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * field without changing larger fields. For example, to roll the current
200151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * date up by one day, you can achieve it by calling:
200251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <p>roll(Calendar.DATE, true).
200351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * When rolling on the year or Calendar.YEAR field, it will roll the year
200451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * value in the range between 1 and the value returned by calling
200551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <code>getMaximum(Calendar.YEAR)</code>.
200651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * When rolling on the month or Calendar.MONTH field, other fields like
200751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * date might conflict and, need to be changed. For instance,
200851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * rolling the month on the date 01/31/96 will result in 02/29/96.
200951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * When rolling on the hour-in-day or Calendar.HOUR_OF_DAY field, it will
201051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * roll the hour value in the range between 0 and 23, which is zero-based.
201151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
201251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param field the time field.
201351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param up indicates if the value of the specified time field is to be
201451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * rolled up or rolled down. Use true if rolling up, false otherwise.
201551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see Calendar#add(int,int)
201651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see Calendar#set(int,int)
201751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
201851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    abstract public void roll(int field, boolean up);
201951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
202051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
202151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Adds the specified (signed) amount to the specified calendar field
202251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * without changing larger fields.  A negative amount means to roll
202351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * down.
202451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
202551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <p>NOTE:  This default implementation on <code>Calendar</code> just repeatedly calls the
202651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * version of {@link #roll(int,boolean) roll()} that rolls by one unit.  This may not
202751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * always do the right thing.  For example, if the <code>DAY_OF_MONTH</code> field is 31,
202851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * rolling through February will leave it set to 28.  The <code>GregorianCalendar</code>
202951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * version of this function takes care of this problem.  Other subclasses
203051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * should also provide overrides of this function that do the right thing.
203151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
203251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param field the calendar field.
203351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param amount the signed amount to add to the calendar <code>field</code>.
203451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @since 1.2
203551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see #roll(int,boolean)
203651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see #add(int,int)
203751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see #set(int,int)
203851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
203951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public void roll(int field, int amount)
204051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    {
204151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        while (amount > 0) {
204251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            roll(field, true);
204351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            amount--;
204451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
204551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        while (amount < 0) {
204651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            roll(field, false);
204751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            amount++;
204851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
204951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
205051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
205151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
205251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Sets the time zone with the given time zone value.
205351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
205451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param value the given time zone.
205551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
205651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public void setTimeZone(TimeZone value)
205751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    {
205851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        zone = value;
205951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        sharedZone = false;
206051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        /* Recompute the fields from the time using the new zone.  This also
206151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski         * works if isTimeSet is false (after a call to set()).  In that case
206251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski         * the time will be computed from the fields using the new zone, then
206351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski         * the fields will get recomputed from that.  Consider the sequence of
206451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski         * calls: cal.setTimeZone(EST); cal.set(HOUR, 1); cal.setTimeZone(PST).
206551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski         * Is cal set to 1 o'clock EST or 1 o'clock PST?  Answer: PST.  More
206651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski         * generally, a call to setTimeZone() affects calls to set() BEFORE AND
206751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski         * AFTER it up to the next call to complete().
206851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski         */
206951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        areAllFieldsSet = areFieldsSet = false;
207051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
207151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
207251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
207351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Gets the time zone.
207451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
207551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @return the time zone object associated with this calendar.
207651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
207751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public TimeZone getTimeZone()
207851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    {
207951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        // If the TimeZone object is shared by other Calendar instances, then
208051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        // create a clone.
208151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if (sharedZone) {
208251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            zone = (TimeZone) zone.clone();
208351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            sharedZone = false;
208451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
208551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return zone;
208651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
208751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
208851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
208951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Returns the time zone (without cloning).
209051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
209151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    TimeZone getZone() {
209251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return zone;
209351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
209451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
209551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
209651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Sets the sharedZone flag to <code>shared</code>.
209751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
209851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    void setZoneShared(boolean shared) {
209951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        sharedZone = shared;
210051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
210151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
210251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
210351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Specifies whether or not date/time interpretation is to be lenient.  With
210451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * lenient interpretation, a date such as "February 942, 1996" will be
210551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * treated as being equivalent to the 941st day after February 1, 1996.
210651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * With strict (non-lenient) interpretation, such dates will cause an exception to be
210751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * thrown. The default is lenient.
210851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
210951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param lenient <code>true</code> if the lenient mode is to be turned
211051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * on; <code>false</code> if it is to be turned off.
211151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see #isLenient()
211251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see java.text.DateFormat#setLenient
211351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
211451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public void setLenient(boolean lenient)
211551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    {
211651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        this.lenient = lenient;
211751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
211851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
211951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
212051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Tells whether date/time interpretation is to be lenient.
212151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
212251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @return <code>true</code> if the interpretation mode of this calendar is lenient;
212351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <code>false</code> otherwise.
212451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see #setLenient(boolean)
212551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
212651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public boolean isLenient()
212751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    {
212851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return lenient;
212951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
213051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
213151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
213251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Sets what the first day of the week is; e.g., <code>SUNDAY</code> in the U.S.,
213351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <code>MONDAY</code> in France.
213451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
213551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param value the given first day of the week.
213651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see #getFirstDayOfWeek()
213751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see #getMinimalDaysInFirstWeek()
213851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
213951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public void setFirstDayOfWeek(int value)
214051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    {
214151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if (firstDayOfWeek == value) {
214251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            return;
214351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
214451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        firstDayOfWeek = value;
214551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        invalidateWeekFields();
214651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
214751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
214851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
214951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Gets what the first day of the week is; e.g., <code>SUNDAY</code> in the U.S.,
215051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <code>MONDAY</code> in France.
215151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
215251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @return the first day of the week.
215351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see #setFirstDayOfWeek(int)
215451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see #getMinimalDaysInFirstWeek()
215551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
215651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public int getFirstDayOfWeek()
215751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    {
215851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return firstDayOfWeek;
215951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
216051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
216151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
216251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Sets what the minimal days required in the first week of the year are;
216351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * For example, if the first week is defined as one that contains the first
216451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * day of the first month of a year, call this method with value 1. If it
216551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * must be a full week, use value 7.
216651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
216751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param value the given minimal days required in the first week
216851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * of the year.
216951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see #getMinimalDaysInFirstWeek()
217051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
217151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public void setMinimalDaysInFirstWeek(int value)
217251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    {
217351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if (minimalDaysInFirstWeek == value) {
217451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            return;
217551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
217651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        minimalDaysInFirstWeek = value;
217751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        invalidateWeekFields();
217851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
217951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
218051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
218151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Gets what the minimal days required in the first week of the year are;
218251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * e.g., if the first week is defined as one that contains the first day
218351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * of the first month of a year, this method returns 1. If
218451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * the minimal days required must be a full week, this method
218551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * returns 7.
218651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
218751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @return the minimal days required in the first week of the year.
218851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see #setMinimalDaysInFirstWeek(int)
218951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
219051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public int getMinimalDaysInFirstWeek()
219151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    {
219251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return minimalDaysInFirstWeek;
219351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
219451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
219551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
219651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Returns whether this {@code Calendar} supports week dates.
219751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
219851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <p>The default implementation of this method returns {@code false}.
219951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
220051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @return {@code true} if this {@code Calendar} supports week dates;
220151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *         {@code false} otherwise.
220251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see #getWeekYear()
220351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see #setWeekDate(int,int,int)
220451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see #getWeeksInWeekYear()
220551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @since 1.7
220651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
220751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public boolean isWeekDateSupported() {
220851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return false;
220951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
221051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
221151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
221251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Returns the week year represented by this {@code Calendar}. The
221351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * week year is in sync with the week cycle. The {@linkplain
221451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * #getFirstDayOfWeek() first day of the first week} is the first
221551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * day of the week year.
221651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
221751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <p>The default implementation of this method throws an
221851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * {@link UnsupportedOperationException}.
221951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
222051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @return the week year of this {@code Calendar}
222151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @exception UnsupportedOperationException
222251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *            if any week year numbering isn't supported
222351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *            in this {@code Calendar}.
222451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see #isWeekDateSupported()
222551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see #getFirstDayOfWeek()
222651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see #getMinimalDaysInFirstWeek()
222751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @since 1.7
222851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
222951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public int getWeekYear() {
223051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        throw new UnsupportedOperationException();
223151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
223251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
223351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
223451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Sets the date of this {@code Calendar} with the the given date
223551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * specifiers - week year, week of year, and day of week.
223651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
223751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <p>Unlike the {@code set} method, all of the calendar fields
223851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * and {@code time} values are calculated upon return.
223951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
224051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <p>If {@code weekOfYear} is out of the valid week-of-year range
224151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * in {@code weekYear}, the {@code weekYear} and {@code
224251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * weekOfYear} values are adjusted in lenient mode, or an {@code
224351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * IllegalArgumentException} is thrown in non-lenient mode.
224451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
224551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <p>The default implementation of this method throws an
224651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * {@code UnsupportedOperationException}.
224751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
224851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param weekYear   the week year
224951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param weekOfYear the week number based on {@code weekYear}
225051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param dayOfWeek  the day of week value: one of the constants
225151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *                   for the {@link #DAY_OF_WEEK} field: {@link
225251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *                   #SUNDAY}, ..., {@link #SATURDAY}.
225351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @exception IllegalArgumentException
225451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *            if any of the given date specifiers is invalid
225551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *            or any of the calendar fields are inconsistent
225651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *            with the given date specifiers in non-lenient mode
225751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @exception UnsupportedOperationException
225851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *            if any week year numbering isn't supported in this
225951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *            {@code Calendar}.
226051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see #isWeekDateSupported()
226151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see #getFirstDayOfWeek()
226251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see #getMinimalDaysInFirstWeek()
226351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @since 1.7
226451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
226551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public void setWeekDate(int weekYear, int weekOfYear, int dayOfWeek) {
226651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        throw new UnsupportedOperationException();
226751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
226851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
226951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
227051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Returns the number of weeks in the week year represented by this
227151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * {@code Calendar}.
227251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
227351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <p>The default implementation of this method throws an
227451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * {@code UnsupportedOperationException}.
227551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
227651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @return the number of weeks in the week year.
227751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @exception UnsupportedOperationException
227851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *            if any week year numbering isn't supported in this
227951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *            {@code Calendar}.
228051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see #WEEK_OF_YEAR
228151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see #isWeekDateSupported()
228251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see #getWeekYear()
228351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see #getActualMaximum(int)
228451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @since 1.7
228551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
228651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public int getWeeksInWeekYear() {
228751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        throw new UnsupportedOperationException();
228851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
228951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
229051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
229151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Returns the minimum value for the given calendar field of this
229251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <code>Calendar</code> instance. The minimum value is defined as
229351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * the smallest value returned by the {@link #get(int) get} method
229451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * for any possible time value.  The minimum value depends on
229551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * calendar system specific parameters of the instance.
229651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
229751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param field the calendar field.
229851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @return the minimum value for the given calendar field.
229951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see #getMaximum(int)
230051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see #getGreatestMinimum(int)
230151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see #getLeastMaximum(int)
230251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see #getActualMinimum(int)
230351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see #getActualMaximum(int)
230451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
230551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    abstract public int getMinimum(int field);
230651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
230751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
230851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Returns the maximum value for the given calendar field of this
230951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <code>Calendar</code> instance. The maximum value is defined as
231051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * the largest value returned by the {@link #get(int) get} method
231151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * for any possible time value. The maximum value depends on
231251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * calendar system specific parameters of the instance.
231351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
231451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param field the calendar field.
231551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @return the maximum value for the given calendar field.
231651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see #getMinimum(int)
231751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see #getGreatestMinimum(int)
231851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see #getLeastMaximum(int)
231951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see #getActualMinimum(int)
232051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see #getActualMaximum(int)
232151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
232251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    abstract public int getMaximum(int field);
232351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
232451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
232551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Returns the highest minimum value for the given calendar field
232651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * of this <code>Calendar</code> instance. The highest minimum
232751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * value is defined as the largest value returned by {@link
232851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * #getActualMinimum(int)} for any possible time value. The
232951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * greatest minimum value depends on calendar system specific
233051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * parameters of the instance.
233151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
233251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param field the calendar field.
233351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @return the highest minimum value for the given calendar field.
233451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see #getMinimum(int)
233551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see #getMaximum(int)
233651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see #getLeastMaximum(int)
233751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see #getActualMinimum(int)
233851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see #getActualMaximum(int)
233951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
234051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    abstract public int getGreatestMinimum(int field);
234151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
234251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
234351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Returns the lowest maximum value for the given calendar field
234451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * of this <code>Calendar</code> instance. The lowest maximum
234551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * value is defined as the smallest value returned by {@link
234651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * #getActualMaximum(int)} for any possible time value. The least
234751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * maximum value depends on calendar system specific parameters of
234851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * the instance. For example, a <code>Calendar</code> for the
234951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Gregorian calendar system returns 28 for the
235051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <code>DAY_OF_MONTH</code> field, because the 28th is the last
235151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * day of the shortest month of this calendar, February in a
235251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * common year.
235351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
235451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param field the calendar field.
235551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @return the lowest maximum value for the given calendar field.
235651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see #getMinimum(int)
235751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see #getMaximum(int)
235851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see #getGreatestMinimum(int)
235951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see #getActualMinimum(int)
236051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see #getActualMaximum(int)
236151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
236251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    abstract public int getLeastMaximum(int field);
236351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
236451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
236551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Returns the minimum value that the specified calendar field
236651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * could have, given the time value of this <code>Calendar</code>.
236751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
236851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <p>The default implementation of this method uses an iterative
236951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * algorithm to determine the actual minimum value for the
237051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * calendar field. Subclasses should, if possible, override this
237151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * with a more efficient implementation - in many cases, they can
237251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * simply return <code>getMinimum()</code>.
237351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
237451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param field the calendar field
237551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @return the minimum of the given calendar field for the time
237651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * value of this <code>Calendar</code>
237751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see #getMinimum(int)
237851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see #getMaximum(int)
237951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see #getGreatestMinimum(int)
238051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see #getLeastMaximum(int)
238151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see #getActualMaximum(int)
238251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @since 1.2
238351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
238451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public int getActualMinimum(int field) {
238551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        int fieldValue = getGreatestMinimum(field);
238651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        int endValue = getMinimum(field);
238751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
238851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        // if we know that the minimum value is always the same, just return it
238951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if (fieldValue == endValue) {
239051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            return fieldValue;
239151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
239251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
239351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        // clone the calendar so we don't mess with the real one, and set it to
239451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        // accept anything for the field values
239551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        Calendar work = (Calendar)this.clone();
239651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        work.setLenient(true);
239751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
239851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        // now try each value from getLeastMaximum() to getMaximum() one by one until
239951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        // we get a value that normalizes to another value.  The last value that
240051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        // normalizes to itself is the actual minimum for the current date
240151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        int result = fieldValue;
240251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
240351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        do {
240451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            work.set(field, fieldValue);
240551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            if (work.get(field) != fieldValue) {
240651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                break;
240751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            } else {
240851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                result = fieldValue;
240951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                fieldValue--;
241051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            }
241151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        } while (fieldValue >= endValue);
241251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
241351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return result;
241451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
241551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
241651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
241751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Returns the maximum value that the specified calendar field
241851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * could have, given the time value of this
241951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <code>Calendar</code>. For example, the actual maximum value of
242051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * the <code>MONTH</code> field is 12 in some years, and 13 in
242151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * other years in the Hebrew calendar system.
242251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
242351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <p>The default implementation of this method uses an iterative
242451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * algorithm to determine the actual maximum value for the
242551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * calendar field. Subclasses should, if possible, override this
242651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * with a more efficient implementation.
242751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
242851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param field the calendar field
242951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @return the maximum of the given calendar field for the time
243051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * value of this <code>Calendar</code>
243151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see #getMinimum(int)
243251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see #getMaximum(int)
243351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see #getGreatestMinimum(int)
243451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see #getLeastMaximum(int)
243551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see #getActualMinimum(int)
243651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @since 1.2
243751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
243851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public int getActualMaximum(int field) {
243951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        int fieldValue = getLeastMaximum(field);
244051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        int endValue = getMaximum(field);
244151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
244251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        // if we know that the maximum value is always the same, just return it.
244351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if (fieldValue == endValue) {
244451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            return fieldValue;
244551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
244651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
244751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        // clone the calendar so we don't mess with the real one, and set it to
244851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        // accept anything for the field values.
244951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        Calendar work = (Calendar)this.clone();
245051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        work.setLenient(true);
245151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
245251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        // if we're counting weeks, set the day of the week to Sunday.  We know the
245351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        // last week of a month or year will contain the first day of the week.
245451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if (field == WEEK_OF_YEAR || field == WEEK_OF_MONTH)
245551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            work.set(DAY_OF_WEEK, firstDayOfWeek);
245651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
245751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        // now try each value from getLeastMaximum() to getMaximum() one by one until
245851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        // we get a value that normalizes to another value.  The last value that
245951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        // normalizes to itself is the actual maximum for the current date
246051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        int result = fieldValue;
246151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
246251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        do {
246351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            work.set(field, fieldValue);
246451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            if (work.get(field) != fieldValue) {
246551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                break;
246651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            } else {
246751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                result = fieldValue;
246851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                fieldValue++;
246951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            }
247051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        } while (fieldValue <= endValue);
247151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
247251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return result;
247351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
247451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
247551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
247651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Creates and returns a copy of this object.
247751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
247851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @return a copy of this object.
247951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
248051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public Object clone()
248151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    {
248251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        try {
248351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            Calendar other = (Calendar) super.clone();
248451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
248551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            other.fields = new int[FIELD_COUNT];
248651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            other.isSet = new boolean[FIELD_COUNT];
248751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            other.stamp = new int[FIELD_COUNT];
248851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            for (int i = 0; i < FIELD_COUNT; i++) {
248951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                other.fields[i] = fields[i];
249051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                other.stamp[i] = stamp[i];
249151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                other.isSet[i] = isSet[i];
249251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            }
249351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            other.zone = (TimeZone) zone.clone();
249451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            return other;
249551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
249651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        catch (CloneNotSupportedException e) {
249751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            // this shouldn't happen, since we are Cloneable
249851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            throw new InternalError();
249951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
250051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
250151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
250251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    private static final String[] FIELD_NAME = {
250351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        "ERA", "YEAR", "MONTH", "WEEK_OF_YEAR", "WEEK_OF_MONTH", "DAY_OF_MONTH",
250451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        "DAY_OF_YEAR", "DAY_OF_WEEK", "DAY_OF_WEEK_IN_MONTH", "AM_PM", "HOUR",
250551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        "HOUR_OF_DAY", "MINUTE", "SECOND", "MILLISECOND", "ZONE_OFFSET",
250651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        "DST_OFFSET"
250751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    };
250851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
250951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
251051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Returns the name of the specified calendar field.
251151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
251251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param field the calendar field
251351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @return the calendar field name
251451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @exception IndexOutOfBoundsException if <code>field</code> is negative,
251551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * equal to or greater then <code>FIELD_COUNT</code>.
251651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
251751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    static final String getFieldName(int field) {
251851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return FIELD_NAME[field];
251951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
252051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
252151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
252251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Return a string representation of this calendar. This method
252351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * is intended to be used only for debugging purposes, and the
252451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * format of the returned string may vary between implementations.
252551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * The returned string may be empty but may not be <code>null</code>.
252651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
252751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @return  a string representation of this calendar.
252851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
252951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public String toString() {
253051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        // NOTE: BuddhistCalendar.toString() interprets the string
253151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        // produced by this method so that the Gregorian year number
253251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        // is substituted by its B.E. year value. It relies on
253351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        // "...,YEAR=<year>,..." or "...,YEAR=?,...".
253451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        StringBuilder buffer = new StringBuilder(800);
253551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        buffer.append(getClass().getName()).append('[');
253651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        appendValue(buffer, "time", isTimeSet, time);
253751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        buffer.append(",areFieldsSet=").append(areFieldsSet);
253851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        buffer.append(",areAllFieldsSet=").append(areAllFieldsSet);
253951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        buffer.append(",lenient=").append(lenient);
254051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        buffer.append(",zone=").append(zone);
254151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        appendValue(buffer, ",firstDayOfWeek", true, (long) firstDayOfWeek);
254251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        appendValue(buffer, ",minimalDaysInFirstWeek", true, (long) minimalDaysInFirstWeek);
254351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        for (int i = 0; i < FIELD_COUNT; ++i) {
254451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            buffer.append(',');
254551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            appendValue(buffer, FIELD_NAME[i], isSet(i), (long) fields[i]);
254651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
254751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        buffer.append(']');
254851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return buffer.toString();
254951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
255051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
255151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    // =======================privates===============================
255251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
255351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    private static final void appendValue(StringBuilder sb, String item, boolean valid, long value) {
255451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        sb.append(item).append('=');
255551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if (valid) {
255651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            sb.append(value);
255751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        } else {
255851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            sb.append('?');
255951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
256051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
256151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
256251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
256351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Both firstDayOfWeek and minimalDaysInFirstWeek are locale-dependent.
256451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * They are used to figure out the week count for a specific date for
256551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * a given locale. These must be set when a Calendar is constructed.
256651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param desiredLocale the given locale.
256751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
256851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    private void setWeekCountData(Locale desiredLocale)
256951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    {
257051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        /* try to get the Locale data from the cache */
257151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        int[] data = cachedLocaleData.get(desiredLocale);
257251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if (data == null) {  /* cache miss */
25739c853c5b9ebbb0ef60a013ae10ee411d70dfa832Piotr Jastrzebski            LocaleData localeData = LocaleData.get(desiredLocale);
257451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            data = new int[2];
25759c853c5b9ebbb0ef60a013ae10ee411d70dfa832Piotr Jastrzebski            data[0] = localeData.firstDayOfWeek.intValue();
25769c853c5b9ebbb0ef60a013ae10ee411d70dfa832Piotr Jastrzebski            data[1] = localeData.minimalDaysInFirstWeek.intValue();
257751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            cachedLocaleData.putIfAbsent(desiredLocale, data);
257851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
257951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        firstDayOfWeek = data[0];
258051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        minimalDaysInFirstWeek = data[1];
258151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
258251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
258351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
258451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Recomputes the time and updates the status fields isTimeSet
258551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * and areFieldsSet.  Callers should check isTimeSet and only
258651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * call this method if isTimeSet is false.
258751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
258851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    private void updateTime() {
258951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        computeTime();
259051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        // The areFieldsSet and areAllFieldsSet values are no longer
259151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        // controlled here (as of 1.5).
259251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        isTimeSet = true;
259351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
259451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
259551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    private int compareTo(long t) {
259651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        long thisTime = getMillisOf(this);
259751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return (thisTime > t) ? 1 : (thisTime == t) ? 0 : -1;
259851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
259951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
260051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    private static final long getMillisOf(Calendar calendar) {
260151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if (calendar.isTimeSet) {
260251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            return calendar.time;
260351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
260451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        Calendar cal = (Calendar) calendar.clone();
260551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        cal.setLenient(true);
260651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return cal.getTimeInMillis();
260751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
260851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
260951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
261051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Adjusts the stamp[] values before nextStamp overflow. nextStamp
261151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * is set to the next stamp value upon the return.
261251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
261351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    private final void adjustStamp() {
261451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        int max = MINIMUM_USER_STAMP;
261551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        int newStamp = MINIMUM_USER_STAMP;
261651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
261751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        for (;;) {
261851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            int min = Integer.MAX_VALUE;
261951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            for (int i = 0; i < stamp.length; i++) {
262051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                int v = stamp[i];
262151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                if (v >= newStamp && min > v) {
262251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                    min = v;
262351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                }
262451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                if (max < v) {
262551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                    max = v;
262651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                }
262751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            }
262851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            if (max != min && min == Integer.MAX_VALUE) {
262951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                break;
263051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            }
263151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            for (int i = 0; i < stamp.length; i++) {
263251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                if (stamp[i] == min) {
263351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                    stamp[i] = newStamp;
263451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                }
263551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            }
263651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            newStamp++;
263751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            if (min == max) {
263851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                break;
263951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            }
264051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
264151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        nextStamp = newStamp;
264251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
264351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
264451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
264551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Sets the WEEK_OF_MONTH and WEEK_OF_YEAR fields to new values with the
264651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * new parameter value if they have been calculated internally.
264751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
264851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    private void invalidateWeekFields()
264951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    {
265051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if (stamp[WEEK_OF_MONTH] != COMPUTED &&
265151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            stamp[WEEK_OF_YEAR] != COMPUTED) {
265251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            return;
265351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
265451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
265551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        // We have to check the new values of these fields after changing
265651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        // firstDayOfWeek and/or minimalDaysInFirstWeek. If the field values
265751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        // have been changed, then set the new values. (4822110)
265851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        Calendar cal = (Calendar) clone();
265951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        cal.setLenient(true);
266051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        cal.clear(WEEK_OF_MONTH);
266151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        cal.clear(WEEK_OF_YEAR);
266251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
266351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if (stamp[WEEK_OF_MONTH] == COMPUTED) {
266451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            int weekOfMonth = cal.get(WEEK_OF_MONTH);
266551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            if (fields[WEEK_OF_MONTH] != weekOfMonth) {
266651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                fields[WEEK_OF_MONTH] = weekOfMonth;
266751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            }
266851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
266951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
267051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if (stamp[WEEK_OF_YEAR] == COMPUTED) {
267151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            int weekOfYear = cal.get(WEEK_OF_YEAR);
267251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            if (fields[WEEK_OF_YEAR] != weekOfYear) {
267351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                fields[WEEK_OF_YEAR] = weekOfYear;
267451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            }
267551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
267651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
267751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
267851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
267951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Save the state of this object to a stream (i.e., serialize it).
268051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
268151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Ideally, <code>Calendar</code> would only write out its state data and
268251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * the current time, and not write any field data out, such as
268351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <code>fields[]</code>, <code>isTimeSet</code>, <code>areFieldsSet</code>,
268451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * and <code>isSet[]</code>.  <code>nextStamp</code> also should not be part
268551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * of the persistent state. Unfortunately, this didn't happen before JDK 1.1
268651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * shipped. To be compatible with JDK 1.1, we will always have to write out
268751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * the field values and state flags.  However, <code>nextStamp</code> can be
268851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * removed from the serialization stream; this will probably happen in the
268951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * near future.
269051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
269151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    private synchronized void writeObject(ObjectOutputStream stream)
269251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski         throws IOException
269351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    {
269451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        // Try to compute the time correctly, for the future (stream
269551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        // version 2) in which we don't write out fields[] or isSet[].
269651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if (!isTimeSet) {
269751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            try {
269851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                updateTime();
269951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            }
270051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            catch (IllegalArgumentException e) {}
270151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
270251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
270351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        // Write out the 1.1 FCS object.
270451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        stream.defaultWriteObject();
270551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
270651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
270751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    private static class CalendarAccessControlContext {
270851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        private static final AccessControlContext INSTANCE;
270951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        static {
271051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            RuntimePermission perm = new RuntimePermission("accessClassInPackage.sun.util.calendar");
271151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            PermissionCollection perms = perm.newPermissionCollection();
271251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            perms.add(perm);
271351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            INSTANCE = new AccessControlContext(new ProtectionDomain[] {
271451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                                                    new ProtectionDomain(null, perms)
271551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                                                });
271651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
271751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
271851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
271951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
272051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Reconstitutes this object from a stream (i.e., deserialize it).
272151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
272251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    private void readObject(ObjectInputStream stream)
272351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski         throws IOException, ClassNotFoundException
272451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    {
272551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        final ObjectInputStream input = stream;
272651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        input.defaultReadObject();
272751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
272851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        stamp = new int[FIELD_COUNT];
272951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
273051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        // Starting with version 2 (not implemented yet), we expect that
273151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        // fields[], isSet[], isTimeSet, and areFieldsSet may not be
273251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        // streamed out anymore.  We expect 'time' to be correct.
273351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if (serialVersionOnStream >= 2)
273451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        {
273551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            isTimeSet = true;
273651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            if (fields == null) fields = new int[FIELD_COUNT];
273751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            if (isSet == null) isSet = new boolean[FIELD_COUNT];
273851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
273951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        else if (serialVersionOnStream >= 0)
274051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        {
274151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            for (int i=0; i<FIELD_COUNT; ++i)
274251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                stamp[i] = isSet[i] ? COMPUTED : UNSET;
274351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
274451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
274551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        serialVersionOnStream = currentSerialVersion;
274651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
274751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        // If the deserialized object has a SimpleTimeZone, try to
274851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        // replace it with a ZoneInfo equivalent (as of 1.4) in order
274951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        // to be compatible with the SimpleTimeZone-based
275051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        // implementation as much as possible.
275151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if (zone instanceof SimpleTimeZone) {
275251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            String id = zone.getID();
275351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            TimeZone tz = TimeZone.getTimeZone(id);
275451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            if (tz != null && tz.hasSameRules(zone) && tz.getID().equals(id)) {
275551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                zone = tz;
275651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            }
275751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
275851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
275951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski}
2760