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 < 00:00 on 19051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Jan 1, 2000 < 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) < 12:01 am, and 12:00 pm (noon) < 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 < 0 || field >= 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 < 0 || field >= 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 < 0 || field >= 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 < 0 || field >= 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 < 0 || field >= 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 < 0 || field >= 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 << 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<<YEAR)|(1<<MONTH)|(1<<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