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