DateFormat.java revision d2d7abef3e9b73a57cdf1f2afd678d7f48945679
1f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes/*
2adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Licensed to the Apache Software Foundation (ASF) under one or more
3adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * contributor license agreements.  See the NOTICE file distributed with
4adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * this work for additional information regarding copyright ownership.
5adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The ASF licenses this file to You under the Apache License, Version 2.0
6adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * (the "License"); you may not use this file except in compliance with
7adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the License.  You may obtain a copy of the License at
8f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes *
9adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *     http://www.apache.org/licenses/LICENSE-2.0
10f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes *
11adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software
12adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
13adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * See the License for the specific language governing permissions and
15adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * limitations under the License.
16adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */
17adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
18adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpackage java.text;
19adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
20757a7942eed2b0aa457f8517a0259d2ac82c5b18Elliott Hughesimport com.ibm.icu4jni.util.ICU;
217365de1056414750d0a7d1fdd26025fd247f0d04Jesse Wilsonimport com.ibm.icu4jni.util.LocaleData;
22adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.InvalidObjectException;
23adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.Calendar;
24adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.Date;
25adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.Hashtable;
26adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.Locale;
27adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.TimeZone;
28adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
29adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/**
30adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * An abstract class for date/time formatting subclasses which formats and
31adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * parses dates or time in a language-independent manner. The date/time
32adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * formatting subclass, such as {@link SimpleDateFormat}, allows for formatting
33adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * (i.e., date -> text), parsing (text -> date), and normalization. The date is
34adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * represented as a {@code Date} object or as the milliseconds since January 1,
35adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 1970, 00:00:00 GMT.
36adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>
37adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * DateFormat provides many class methods for obtaining default date/time
38adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * formatters based on the default or a given locale and a number of formatting
39adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * styles. The formatting styles include FULL, LONG, MEDIUM, and SHORT. More
40adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * details and examples for using these styles are provided in the method
41adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * descriptions.
42adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>
43adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code DateFormat} helps you to format and parse dates for any locale. Your
44adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * code can be completely independent of the locale conventions for months, days
45adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * of the week, or even the calendar format: lunar vs. solar.
46adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>
47adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * To format a date for the current Locale, use one of the static factory
48adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * methods:
49adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <blockquote>
509b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson *
51adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <pre>
52adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * myString = DateFormat.getDateInstance().format(myDate);
53adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </pre>
549b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson *
55adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </blockquote>
56adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>
57adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * If you are formatting multiple dates, it is more efficient to get the format
58adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * and use it multiple times so that the system doesn't have to fetch the
59adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * information about the local language and country conventions multiple times.
60adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <blockquote>
619b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson *
62adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <pre>
63adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * DateFormat df = DateFormat.getDateInstance();
64adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * for (int i = 0; i &lt; a.length; ++i) {
65adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *     output.println(df.format(myDate[i]) + &quot;; &quot;);
66adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * }
67adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </pre>
689b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson *
69adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </blockquote>
70adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>
71adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * To format a number for a different locale, specify it in the call to
72adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code getDateInstance}:
73adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <blockquote>
749b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson *
75adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <pre>
76adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * DateFormat df = DateFormat.getDateInstance(DateFormat.LONG, Locale.FRANCE);
77adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </pre>
789b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson *
79adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </blockquote>
80adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>
81adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code DateFormat} can also be used to parse strings:
82adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <blockquote>
839b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson *
84adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <pre>
85adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * myDate = df.parse(myString);
86adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </pre>
879b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson *
88adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </blockquote>
89adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>
90adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Use {@code getDateInstance} to get the normal date format for a country.
91adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Other static factory methods are available: Use {@code getTimeInstance} to
92adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * get the time format for a country. Use {@code getDateTimeInstance} to get the
93adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * date and time format. You can pass in different options to these factory
94adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * methods to control the length of the result; from SHORT to MEDIUM to LONG to
95adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * FULL. The exact result depends on the locale, but generally:
96adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <ul>
97adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li>SHORT is completely numeric, such as 12.13.52 or 3:30pm
98adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li>MEDIUM is longer, such as Jan 12, 1952
99adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li>LONG is longer, such as January 12, 1952 or 3:30:32pm
100adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li>FULL is pretty completely specified, such as Tuesday, April 12, 1952 AD
101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * or 3:30:42pm PST.
102adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </ul>
103adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>
104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * If needed, the time zone can be set on the format. For even greater control
105adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * over the formatting or parsing, try casting the {@code DateFormat} you get
106adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * from the factory methods to a {@code SimpleDateFormat}. This will work for
107adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the majority of countries; just remember to put it in a try block in case you
108adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * encounter an unusual one.
109adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>
110adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * There are versions of the parse and format methods which use
111adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code ParsePosition} and {@code FieldPosition} to allow you to
112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <ul>
113adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li>progressively parse through pieces of a string;
114adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li>align any particular field.
115adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </ul>
116adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <h4>Synchronization</h4>
117adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>
118adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Date formats are not synchronized. It is recommended to create separate
119adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * format instances for each thread. If multiple threads access a format
120adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * concurrently, it must be synchronized externally.
1219b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson *
122adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see NumberFormat
123adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see SimpleDateFormat
124adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see Calendar
125adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see TimeZone
126adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */
127adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpublic abstract class DateFormat extends Format {
128adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
129adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private static final long serialVersionUID = 7218322306649953788L;
130adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
131adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
132adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * The calendar that this {@code DateFormat} uses to format a number
133adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * representing a date.
134adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
135adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    protected Calendar calendar;
136adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
137adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
138adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * The number format used to format a number.
139adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
140adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    protected NumberFormat numberFormat;
141adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
142adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
143adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * The format style constant defining the default format style. The default
144adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * is MEDIUM.
145adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
146adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public final static int DEFAULT = 2;
147adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
148adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
149adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * The format style constant defining the full style.
150adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
151adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public final static int FULL = 0;
152adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
153adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
154adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * The format style constant defining the long style.
155adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
156adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public final static int LONG = 1;
157adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
158adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
159adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * The format style constant defining the medium style.
160adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
161adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public final static int MEDIUM = 2;
162adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
163adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
164adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * The format style constant defining the short style.
165adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
166adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public final static int SHORT = 3;
167adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
168adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
169adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * The {@code FieldPosition} selector for 'G' field alignment, corresponds
170adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * to the {@link Calendar#ERA} field.
171adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
172adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public final static int ERA_FIELD = 0;
173adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
174adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
175adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * The {@code FieldPosition} selector for 'y' field alignment, corresponds
176adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * to the {@link Calendar#YEAR} field.
177adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
178adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public final static int YEAR_FIELD = 1;
179adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
180adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
181adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * The {@code FieldPosition} selector for 'M' field alignment, corresponds
182adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * to the {@link Calendar#MONTH} field.
183adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
184adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public final static int MONTH_FIELD = 2;
185adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
186adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
187adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * The {@code FieldPosition} selector for 'd' field alignment, corresponds
188adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * to the {@link Calendar#DATE} field.
189adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
190adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public final static int DATE_FIELD = 3;
191adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
192adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
193adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * The {@code FieldPosition} selector for 'k' field alignment, corresponds
194adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * to the {@link Calendar#HOUR_OF_DAY} field. {@code HOUR_OF_DAY1_FIELD} is
195adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * used for the one-based 24-hour clock. For example, 23:59 + 01:00 results
196adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * in 24:59.
197adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
198adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public final static int HOUR_OF_DAY1_FIELD = 4;
199adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
200adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
201adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * The {@code FieldPosition} selector for 'H' field alignment, corresponds
202adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * to the {@link Calendar#HOUR_OF_DAY} field. {@code HOUR_OF_DAY0_FIELD} is
203adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * used for the zero-based 24-hour clock. For example, 23:59 + 01:00 results
204adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * in 00:59.
205adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
206adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public final static int HOUR_OF_DAY0_FIELD = 5;
207adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
208adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
209adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * FieldPosition selector for 'm' field alignment, corresponds to the
210adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@link Calendar#MINUTE} field.
211adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
212adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public final static int MINUTE_FIELD = 6;
213adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
214adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
215adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * FieldPosition selector for 's' field alignment, corresponds to the
216adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@link Calendar#SECOND} field.
217adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
218adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public final static int SECOND_FIELD = 7;
219adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
220adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
221adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * FieldPosition selector for 'S' field alignment, corresponds to the
222adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@link Calendar#MILLISECOND} field.
223adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
224adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public final static int MILLISECOND_FIELD = 8;
225adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
226adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
227adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * FieldPosition selector for 'E' field alignment, corresponds to the
228adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@link Calendar#DAY_OF_WEEK} field.
229adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
230adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public final static int DAY_OF_WEEK_FIELD = 9;
231adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
232adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
233adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * FieldPosition selector for 'D' field alignment, corresponds to the
234adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@link Calendar#DAY_OF_YEAR} field.
235adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
236adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public final static int DAY_OF_YEAR_FIELD = 10;
237adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
238adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
239adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * FieldPosition selector for 'F' field alignment, corresponds to the
240adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@link Calendar#DAY_OF_WEEK_IN_MONTH} field.
241adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
242adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public final static int DAY_OF_WEEK_IN_MONTH_FIELD = 11;
243adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
244adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
245adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * FieldPosition selector for 'w' field alignment, corresponds to the
246adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@link Calendar#WEEK_OF_YEAR} field.
247adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
248adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public final static int WEEK_OF_YEAR_FIELD = 12;
249adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
250adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
251adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * FieldPosition selector for 'W' field alignment, corresponds to the
252adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@link Calendar#WEEK_OF_MONTH} field.
253adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
254adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public final static int WEEK_OF_MONTH_FIELD = 13;
255adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
256adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
257adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * FieldPosition selector for 'a' field alignment, corresponds to the
258adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@link Calendar#AM_PM} field.
259adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
260adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public final static int AM_PM_FIELD = 14;
261adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
262adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
263adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * FieldPosition selector for 'h' field alignment, corresponding to the
264143e8c9cf91cfc01c3c91c8e93cad661ec7554eeElliott Hughes     * {@link Calendar#HOUR} field.
265adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
266adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public final static int HOUR1_FIELD = 15;
267adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
268adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
269143e8c9cf91cfc01c3c91c8e93cad661ec7554eeElliott Hughes     * The {@code FieldPosition} selector for 'K' field alignment, corresponding to the
270143e8c9cf91cfc01c3c91c8e93cad661ec7554eeElliott Hughes     * {@link Calendar#HOUR} field.
271adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
272adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public final static int HOUR0_FIELD = 16;
273adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
274adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
275adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * The {@code FieldPosition} selector for 'z' field alignment, corresponds
276adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * to the {@link Calendar#ZONE_OFFSET} and {@link Calendar#DST_OFFSET}
277adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * fields.
278adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
279adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public final static int TIMEZONE_FIELD = 17;
280adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
281adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
282adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Constructs a new instance of {@code DateFormat}.
283adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
284adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    protected DateFormat() {
285adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
286adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
287adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
288adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns a new instance of {@code DateFormat} with the same properties.
289f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
290adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return a shallow copy of this {@code DateFormat}.
291f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
292adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see java.lang.Cloneable
293adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
294adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
295adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public Object clone() {
296adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        DateFormat clone = (DateFormat) super.clone();
297adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        clone.calendar = (Calendar) calendar.clone();
298adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        clone.numberFormat = (NumberFormat) numberFormat.clone();
299adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return clone;
300adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
301adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
302adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
303adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Compares this date format with the specified object and indicates if they
304adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * are equal.
305f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
306adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param object
307adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the object to compare with this date format.
308adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return {@code true} if {@code object} is a {@code DateFormat} object and
309adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         it has the same properties as this date format; {@code false}
310adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         otherwise.
311adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see #hashCode
312adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
313adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
314adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public boolean equals(Object object) {
315adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (this == object) {
316adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return true;
317adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
318adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (!(object instanceof DateFormat)) {
319adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return false;
320adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
321adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        DateFormat dateFormat = (DateFormat) object;
322adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return numberFormat.equals(dateFormat.numberFormat)
323adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                && calendar.getTimeZone().equals(
324adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                        dateFormat.calendar.getTimeZone())
325adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                && calendar.getFirstDayOfWeek() == dateFormat.calendar
326adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                        .getFirstDayOfWeek()
327adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                && calendar.getMinimalDaysInFirstWeek() == dateFormat.calendar
328adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                        .getMinimalDaysInFirstWeek()
329adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                && calendar.isLenient() == dateFormat.calendar.isLenient();
330adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
331adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
332adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
333adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Formats the specified object as a string using the pattern of this date
334adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * format and appends the string to the specified string buffer.
335adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <p>
336adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * If the {@code field} member of {@code field} contains a value specifying
337adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * a format field, then its {@code beginIndex} and {@code endIndex} members
338adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * will be updated with the position of the first occurrence of this field
339adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * in the formatted text.
3409b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson     *
341adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param object
342adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the source object to format, must be a {@code Date} or a
343adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            {@code Number}. If {@code object} is a number then a date is
344adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            constructed using the {@code longValue()} of the number.
345adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param buffer
346adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the target string buffer to append the formatted date/time to.
347adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param field
348adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            on input: an optional alignment field; on output: the offsets
349adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            of the alignment field in the formatted text.
350adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the string buffer.
3519b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson     * @throws IllegalArgumentException
3529b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson     *            if {@code object} is neither a {@code Date} nor a
3539b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson     *            {@code Number} instance.
354adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
355adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
356adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public final StringBuffer format(Object object, StringBuffer buffer,
357adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            FieldPosition field) {
358adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (object instanceof Date) {
359adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return format((Date) object, buffer, field);
360adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
361adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (object instanceof Number) {
362adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return format(new Date(((Number) object).longValue()), buffer,
363adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    field);
364adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
365adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        throw new IllegalArgumentException();
366adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
367adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
368adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
369adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Formats the specified date using the rules of this date format.
370f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
371adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param date
372adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the date to format.
373adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the formatted string.
374adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
375adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public final String format(Date date) {
376adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return format(date, new StringBuffer(), new FieldPosition(0))
377adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                .toString();
378adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
379adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
380adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
381adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Formats the specified date as a string using the pattern of this date
382adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * format and appends the string to the specified string buffer.
383adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <p>
384adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * If the {@code field} member of {@code field} contains a value specifying
385adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * a format field, then its {@code beginIndex} and {@code endIndex} members
386adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * will be updated with the position of the first occurrence of this field
387adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * in the formatted text.
3889b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson     *
389adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param date
390adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the date to format.
391adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param buffer
392adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the target string buffer to append the formatted date/time to.
393adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param field
394adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            on input: an optional alignment field; on output: the offsets
395adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            of the alignment field in the formatted text.
396adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the string buffer.
397adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
398adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public abstract StringBuffer format(Date date, StringBuffer buffer,
399adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            FieldPosition field);
400adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
401adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
40293f0d794f264baeb7a90d02e58cae60305b3912aElliott Hughes     * Returns an array of locales for which custom {@code DateFormat} instances
40393f0d794f264baeb7a90d02e58cae60305b3912aElliott Hughes     * are available.
404d2d7abef3e9b73a57cdf1f2afd678d7f48945679Elliott Hughes     * <p>Note that Android does not support user-supplied locale service providers.
405adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
406adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static Locale[] getAvailableLocales() {
407757a7942eed2b0aa457f8517a0259d2ac82c5b18Elliott Hughes        return ICU.getAvailableDateFormatLocales();
408adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
409adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
410adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
411adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the calendar used by this {@code DateFormat}.
412f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
413adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the calendar used by this date format.
414adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
415adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public Calendar getCalendar() {
416adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return calendar;
417adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
418adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
419adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
420adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns a {@code DateFormat} instance for formatting and parsing dates in
421adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * the DEFAULT style for the default locale.
422f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
423adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the {@code DateFormat} instance for the default style and locale.
424adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
425adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public final static DateFormat getDateInstance() {
426adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return getDateInstance(DEFAULT);
427adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
428adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
429adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
430adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns a {@code DateFormat} instance for formatting and parsing dates in
4313106a99ccbe2e2a25bb66266d0ee42d98dd18099Elliott Hughes     * the specified style for the user's default locale.
4323106a99ccbe2e2a25bb66266d0ee42d98dd18099Elliott Hughes     * See "<a href="../util/Locale.html#default_locale">Be wary of the default locale</a>".
433adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param style
434adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            one of SHORT, MEDIUM, LONG, FULL, or DEFAULT.
435adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the {@code DateFormat} instance for {@code style} and the default
436adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         locale.
437adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IllegalArgumentException
438adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if {@code style} is not one of SHORT, MEDIUM, LONG, FULL, or
439adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             DEFAULT.
440adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
441adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public final static DateFormat getDateInstance(int style) {
442adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        checkDateStyle(style);
443adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return getDateInstance(style, Locale.getDefault());
444adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
445adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
446adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
447adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns a {@code DateFormat} instance for formatting and parsing dates in
448adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * the specified style for the specified locale.
449f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
450adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param style
451adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            one of SHORT, MEDIUM, LONG, FULL, or DEFAULT.
452adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param locale
453adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the locale.
454adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IllegalArgumentException
455adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if {@code style} is not one of SHORT, MEDIUM, LONG, FULL, or
456adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             DEFAULT.
457adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the {@code DateFormat} instance for {@code style} and
458adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         {@code locale}.
459adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
460adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public final static DateFormat getDateInstance(int style, Locale locale) {
461adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        checkDateStyle(style);
462757a7942eed2b0aa457f8517a0259d2ac82c5b18Elliott Hughes        return new SimpleDateFormat(LocaleData.get(locale).getDateFormat(style), locale);
463adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
464adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
465adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
466adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns a {@code DateFormat} instance for formatting and parsing dates
467adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * and time values in the DEFAULT style for the default locale.
468f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
469adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the {@code DateFormat} instance for the default style and locale.
470adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
471adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public final static DateFormat getDateTimeInstance() {
472adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return getDateTimeInstance(DEFAULT, DEFAULT);
473adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
474adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
475adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
476adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns a {@code DateFormat} instance for formatting and parsing of both
4773106a99ccbe2e2a25bb66266d0ee42d98dd18099Elliott Hughes     * dates and time values in the manner appropriate for the user's default locale.
4783106a99ccbe2e2a25bb66266d0ee42d98dd18099Elliott Hughes     * See "<a href="../util/Locale.html#default_locale">Be wary of the default locale</a>".
479adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param dateStyle
480adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            one of SHORT, MEDIUM, LONG, FULL, or DEFAULT.
481adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param timeStyle
482adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            one of SHORT, MEDIUM, LONG, FULL, or DEFAULT.
483adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the {@code DateFormat} instance for {@code dateStyle},
484adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         {@code timeStyle} and the default locale.
485adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IllegalArgumentException
486adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if {@code dateStyle} or {@code timeStyle} is not one of
487adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             SHORT, MEDIUM, LONG, FULL, or DEFAULT.
488adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
4893106a99ccbe2e2a25bb66266d0ee42d98dd18099Elliott Hughes    public final static DateFormat getDateTimeInstance(int dateStyle, int timeStyle) {
490adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        checkTimeStyle(timeStyle);
491adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        checkDateStyle(dateStyle);
492adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return getDateTimeInstance(dateStyle, timeStyle, Locale.getDefault());
493adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
494adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
495adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
496adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns a {@code DateFormat} instance for formatting and parsing dates
497adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * and time values in the specified styles for the specified locale.
498f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
499adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param dateStyle
500adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            one of SHORT, MEDIUM, LONG, FULL, or DEFAULT.
501adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param timeStyle
502adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            one of SHORT, MEDIUM, LONG, FULL, or DEFAULT.
503adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param locale
504adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the locale.
505adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the {@code DateFormat} instance for {@code dateStyle},
506adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         {@code timeStyle} and {@code locale}.
507adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IllegalArgumentException
508adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if {@code dateStyle} or {@code timeStyle} is not one of
509adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             SHORT, MEDIUM, LONG, FULL, or DEFAULT.
510adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
511757a7942eed2b0aa457f8517a0259d2ac82c5b18Elliott Hughes    public final static DateFormat getDateTimeInstance(int dateStyle, int timeStyle, Locale locale) {
512adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        checkTimeStyle(timeStyle);
513adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        checkDateStyle(dateStyle);
514757a7942eed2b0aa457f8517a0259d2ac82c5b18Elliott Hughes        LocaleData localeData = LocaleData.get(locale);
5156ca85c49efc0f02d69933f60b207b964a999061fElliott Hughes        String pattern = localeData.getDateFormat(dateStyle) + " " + localeData.getTimeFormat(timeStyle);
516adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return new SimpleDateFormat(pattern, locale);
517adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
518adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
519adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
520adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns a {@code DateFormat} instance for formatting and parsing dates
521adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * and times in the SHORT style for the default locale.
522f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
523adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the {@code DateFormat} instance for the SHORT style and default
524adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         locale.
525adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
526adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public final static DateFormat getInstance() {
527adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return getDateTimeInstance(SHORT, SHORT);
528adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
529adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
530adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
531adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the {@code NumberFormat} used by this {@code DateFormat}.
532f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
533adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the {@code NumberFormat} used by this date format.
534adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
535adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public NumberFormat getNumberFormat() {
536adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return numberFormat;
537adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
538adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
539adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
540adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns a {@code DateFormat} instance for formatting and parsing time
541adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * values in the DEFAULT style for the default locale.
542f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
543adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the {@code DateFormat} instance for the default style and locale.
544adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
545adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public final static DateFormat getTimeInstance() {
546adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return getTimeInstance(DEFAULT);
547adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
548adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
549adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
550adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns a {@code DateFormat} instance for formatting and parsing time
5513106a99ccbe2e2a25bb66266d0ee42d98dd18099Elliott Hughes     * values in the specified style for the user's default locale.
5523106a99ccbe2e2a25bb66266d0ee42d98dd18099Elliott Hughes     * See "<a href="../util/Locale.html#default_locale">Be wary of the default locale</a>".
553adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param style
554adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            one of SHORT, MEDIUM, LONG, FULL, or DEFAULT.
555adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the {@code DateFormat} instance for {@code style} and the default
556adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         locale.
557adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IllegalArgumentException
558adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if {@code style} is not one of SHORT, MEDIUM, LONG, FULL, or
559adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             DEFAULT.
560adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
561adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public final static DateFormat getTimeInstance(int style) {
562adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        checkTimeStyle(style);
563adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return getTimeInstance(style, Locale.getDefault());
564adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
565adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
566adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
567adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns a {@code DateFormat} instance for formatting and parsing time
568adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * values in the specified style for the specified locale.
569f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
570adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param style
571adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            one of SHORT, MEDIUM, LONG, FULL, or DEFAULT.
572adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param locale
573adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the locale.
574adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IllegalArgumentException
575adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if {@code style} is not one of SHORT, MEDIUM, LONG, FULL, or
576adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             DEFAULT.
577adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the {@code DateFormat} instance for {@code style} and
578adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         {@code locale}.
579adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
580adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public final static DateFormat getTimeInstance(int style, Locale locale) {
581adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        checkTimeStyle(style);
582757a7942eed2b0aa457f8517a0259d2ac82c5b18Elliott Hughes        return new SimpleDateFormat(LocaleData.get(locale).getTimeFormat(style), locale);
583adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
584adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
585adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
586adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the time zone of this date format's calendar.
587f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
588adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the time zone of the calendar used by this date format.
589adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
590adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public TimeZone getTimeZone() {
591adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return calendar.getTimeZone();
592adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
593adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
594adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
595adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public int hashCode() {
596adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return calendar.getFirstDayOfWeek()
597adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                + calendar.getMinimalDaysInFirstWeek()
598adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                + calendar.getTimeZone().hashCode()
599adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                + (calendar.isLenient() ? 1231 : 1237)
600adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                + numberFormat.hashCode();
601adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
602adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
603adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
604adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Indicates whether the calendar used by this date format is lenient.
605f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
606adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return {@code true} if the calendar is lenient; {@code false} otherwise.
607adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
608adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public boolean isLenient() {
609adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return calendar.isLenient();
610adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
611adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
612adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
613adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Parses a date from the specified string using the rules of this date
614adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * format.
615f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
616adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param string
617adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the string to parse.
618adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the {@code Date} resulting from the parsing.
6199b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson     * @throws ParseException
6209b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson     *         if an error occurs during parsing.
621adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
622adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public Date parse(String string) throws ParseException {
623adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        ParsePosition position = new ParsePosition(0);
624adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Date date = parse(string, position);
625fe1eba10c5d69e115dfab55d82cc22d42e9fbae5Elliott Hughes        if (position.getIndex() == 0) {
62603c0a8e681c776fdba0389ab8593282139afc6d6Elliott Hughes            throw new ParseException("Unparseable date " + string, position.getErrorIndex());
627adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
628adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return date;
629adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
630adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
631adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
632adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Parses a date from the specified string starting at the index specified
633adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * by {@code position}. If the string is successfully parsed then the index
634adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * of the {@code ParsePosition} is updated to the index following the parsed
635adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * text. On error, the index is unchanged and the error index of {@code
636adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * ParsePosition} is set to the index where the error occurred.
637adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <p>
638adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * By default, parsing is lenient: If the input is not in the form used by
639adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * this object's format method but can still be parsed as a date, then the
640adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * parse succeeds. Clients may insist on strict adherence to the format by
641adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * calling {@code setLenient(false)}.
6429b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson     *
643adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param string
644adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the string to parse.
645adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param position
646adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            input/output parameter, specifies the start index in {@code
647adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            string} from where to start parsing. If parsing is successful,
648adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            it is updated with the index following the parsed text; on
649adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            error, the index is unchanged and the error index is set to
650adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the index where the error occurred.
651adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the date resulting from the parse, or {@code null} if there is an
652adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         error.
653adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
654adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public abstract Date parse(String string, ParsePosition position);
655adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
656adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
657adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Parses a date from the specified string starting at the index specified
658adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * by {@code position}. If the string is successfully parsed then the index
659adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * of the {@code ParsePosition} is updated to the index following the parsed
660adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * text. On error, the index is unchanged and the error index of
661adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code ParsePosition} is set to the index where the error occurred.
662adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <p>
663adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * By default, parsing is lenient: If the input is not in the form used by
664adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * this object's format method but can still be parsed as a date, then the
665adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * parse succeeds. Clients may insist on strict adherence to the format by
666adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * calling {@code setLenient(false)}.
6679b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson     *
668adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param string
669adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the string to parse.
670adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param position
671adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            input/output parameter, specifies the start index in
672adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            {@code string} from where to start parsing. If parsing is
673adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            successful, it is updated with the index following the parsed
674adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            text; on error, the index is unchanged and the error index
675adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            is set to the index where the error occurred.
676adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the date resulting from the parsing, or {@code null} if there is
677adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         an error.
678adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
679adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
680adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public Object parseObject(String string, ParsePosition position) {
681adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return parse(string, position);
682adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
683adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
684adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
685adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sets the calendar used by this date format.
686f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
687adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param cal
688adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the new calendar.
689adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
690adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void setCalendar(Calendar cal) {
691adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        calendar = cal;
692adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
693adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
694adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
695adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Specifies whether or not date/time parsing shall be lenient. With lenient
696adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * parsing, the parser may use heuristics to interpret inputs that do not
697adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * precisely match this object's format. With strict parsing, inputs must
698adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * match this object's format.
699f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
700adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param value
701adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            {@code true} to set the calendar to be lenient, {@code false}
702adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            otherwise.
703adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
704adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void setLenient(boolean value) {
705adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        calendar.setLenient(value);
706adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
707adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
708adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
709adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sets the {@code NumberFormat} used by this date format.
710f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
711adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param format
712adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the new number format.
713adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
714adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void setNumberFormat(NumberFormat format) {
715adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        numberFormat = format;
716adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
717adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
718adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
719adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sets the time zone of the calendar used by this date format.
720f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
721adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param timezone
722adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the new time zone.
723adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
724adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void setTimeZone(TimeZone timezone) {
725adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        calendar.setTimeZone(timezone);
726adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
727adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
728adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
729adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * The instances of this inner class are used as attribute keys and values
730adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * in {@code AttributedCharacterIterator} that the
731adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@link SimpleDateFormat#formatToCharacterIterator(Object)} method returns.
732adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <p>
733adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * There is no public constructor in this class, the only instances are the
734adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * constants defined here.
735adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
736adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static class Field extends Format.Field {
737adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
738adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        private static final long serialVersionUID = 7441350119349544720L;
739adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
740adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        private static Hashtable<Integer, Field> table = new Hashtable<Integer, Field>();
741adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
742adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /**
743adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * Marks the era part of a date.
744adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
74503c0a8e681c776fdba0389ab8593282139afc6d6Elliott Hughes        public final static Field ERA = new Field("era", Calendar.ERA);
746adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
747adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /**
748adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * Marks the year part of a date.
749adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
75003c0a8e681c776fdba0389ab8593282139afc6d6Elliott Hughes        public final static Field YEAR = new Field("year", Calendar.YEAR);
751adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
752adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /**
753adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * Marks the month part of a date.
754adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
75503c0a8e681c776fdba0389ab8593282139afc6d6Elliott Hughes        public final static Field MONTH = new Field("month", Calendar.MONTH);
756adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
757adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /**
758adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * Marks the hour of the day part of a date (0-11).
759adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
76003c0a8e681c776fdba0389ab8593282139afc6d6Elliott Hughes        public final static Field HOUR_OF_DAY0 = new Field("hour of day", Calendar.HOUR_OF_DAY);
761adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
762adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /**
763adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * Marks the hour of the day part of a date (1-12).
764adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
76503c0a8e681c776fdba0389ab8593282139afc6d6Elliott Hughes        public final static Field HOUR_OF_DAY1 = new Field("hour of day 1", -1);
766adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
767adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /**
768adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * Marks the minute part of a time.
769adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
77003c0a8e681c776fdba0389ab8593282139afc6d6Elliott Hughes        public final static Field MINUTE = new Field("minute", Calendar.MINUTE);
771adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
772adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /**
773adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * Marks the second part of a time.
774adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
77503c0a8e681c776fdba0389ab8593282139afc6d6Elliott Hughes        public final static Field SECOND = new Field("second", Calendar.SECOND);
776adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
777adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /**
778adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * Marks the millisecond part of a time.
779adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
78003c0a8e681c776fdba0389ab8593282139afc6d6Elliott Hughes        public final static Field MILLISECOND = new Field("millisecond", Calendar.MILLISECOND);
781adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
782adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /**
783adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * Marks the day of the week part of a date.
784adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
78503c0a8e681c776fdba0389ab8593282139afc6d6Elliott Hughes        public final static Field DAY_OF_WEEK = new Field("day of week", Calendar.DAY_OF_WEEK);
786adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
787adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /**
788adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * Marks the day of the month part of a date.
789adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
79003c0a8e681c776fdba0389ab8593282139afc6d6Elliott Hughes        public final static Field DAY_OF_MONTH = new Field("day of month", Calendar.DAY_OF_MONTH);
791adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
792adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /**
793adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * Marks the day of the year part of a date.
794adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
79503c0a8e681c776fdba0389ab8593282139afc6d6Elliott Hughes        public final static Field DAY_OF_YEAR = new Field("day of year", Calendar.DAY_OF_YEAR);
796adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
797adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /**
798adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * Marks the day of the week in the month part of a date.
799adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
80003c0a8e681c776fdba0389ab8593282139afc6d6Elliott Hughes        public final static Field DAY_OF_WEEK_IN_MONTH = new Field("day of week in month",
80103c0a8e681c776fdba0389ab8593282139afc6d6Elliott Hughes                Calendar.DAY_OF_WEEK_IN_MONTH);
802adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
803adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /**
804adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * Marks the week of the year part of a date.
805adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
80603c0a8e681c776fdba0389ab8593282139afc6d6Elliott Hughes        public final static Field WEEK_OF_YEAR = new Field("week of year",
807adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                Calendar.WEEK_OF_YEAR);
808adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
809adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /**
810adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * Marks the week of the month part of a date.
811adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
81203c0a8e681c776fdba0389ab8593282139afc6d6Elliott Hughes        public final static Field WEEK_OF_MONTH = new Field("week of month",
813adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                Calendar.WEEK_OF_MONTH);
814adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
815adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /**
816adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * Marks the time indicator part of a date.
817adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
81803c0a8e681c776fdba0389ab8593282139afc6d6Elliott Hughes        public final static Field AM_PM = new Field("am pm", Calendar.AM_PM);
819adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
820adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /**
821adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * Marks the hour part of a date (0-11).
822adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
82303c0a8e681c776fdba0389ab8593282139afc6d6Elliott Hughes        public final static Field HOUR0 = new Field("hour", Calendar.HOUR);
824adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
825adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /**
826adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * Marks the hour part of a date (1-12).
827adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
82803c0a8e681c776fdba0389ab8593282139afc6d6Elliott Hughes        public final static Field HOUR1 = new Field("hour 1", -1);
829adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
830adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /**
831adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * Marks the time zone part of a date.
832adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
83303c0a8e681c776fdba0389ab8593282139afc6d6Elliott Hughes        public final static Field TIME_ZONE = new Field("time zone", -1);
834adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
835adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /**
836adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * The calendar field that this field represents.
837adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
838adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        private int calendarField = -1;
839adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
840adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /**
841adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * Constructs a new instance of {@code DateFormat.Field} with the given
842adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * fieldName and calendar field.
8439b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson         *
844adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * @param fieldName
845adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         *            the field name.
846adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * @param calendarField
847adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         *            the calendar field type of the field.
848adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
849adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        protected Field(String fieldName, int calendarField) {
850adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            super(fieldName);
851adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            this.calendarField = calendarField;
852a0a4196cb15480959f053d0ebe6b412bd23c8170Elliott Hughes            if (calendarField != -1 && table.get(Integer.valueOf(calendarField)) == null) {
853a0a4196cb15480959f053d0ebe6b412bd23c8170Elliott Hughes                table.put(Integer.valueOf(calendarField), this);
854adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
855adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
856adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
857adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /**
858adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * Returns the Calendar field that this field represents.
859f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes         *
860adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * @return the calendar field.
861adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
862adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public int getCalendarField() {
863adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return calendarField;
864adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
865adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
866adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /**
867adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * Returns the {@code DateFormat.Field} instance for the given calendar
868adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * field.
869f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes         *
870adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * @param calendarField
871adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         *            a calendar field constant.
872adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * @return the {@code DateFormat.Field} corresponding to
873adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         *         {@code calendarField}.
874adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * @throws IllegalArgumentException
875adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         *             if {@code calendarField} is negative or greater than the
876adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         *             field count of {@code Calendar}.
877adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
878adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public static Field ofCalendarField(int calendarField) {
879adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (calendarField < 0 || calendarField >= Calendar.FIELD_COUNT) {
880adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                throw new IllegalArgumentException();
881adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
882adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
883a0a4196cb15480959f053d0ebe6b412bd23c8170Elliott Hughes            return table.get(Integer.valueOf(calendarField));
884adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
885adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
886adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /**
887adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * Resolves instances that are deserialized to the constant
888adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * {@code DateFormat.Field} values.
8899b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson         *
890adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * @return the resolved field object.
891adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * @throws InvalidObjectException
892adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         *             if an error occurs while resolving the field object.
893adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
894adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        @Override
895adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        protected Object readResolve() throws InvalidObjectException {
89603c0a8e681c776fdba0389ab8593282139afc6d6Elliott Hughes            if (this.getClass() != Field.class) {
89703c0a8e681c776fdba0389ab8593282139afc6d6Elliott Hughes                throw new InvalidObjectException("cannot resolve subclasses");
8989b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson            }
899adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (calendarField != -1) {
900adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                try {
901adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    Field result = ofCalendarField(calendarField);
902f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
9039b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson                    if (result != null && this.getName().equals(result.getName())) {
904adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                        return result;
905adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    }
906adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                } catch (IllegalArgumentException e) {
90703c0a8e681c776fdba0389ab8593282139afc6d6Elliott Hughes                    throw new InvalidObjectException("Unknown attribute");
908adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                }
909adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            } else {
910adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                if (this.equals(TIME_ZONE)) {
911adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    return TIME_ZONE;
912adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                }
913adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                if (this.equals(HOUR1)) {
914adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    return HOUR1;
915adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                }
916adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                if (this.equals(HOUR_OF_DAY1)) {
917adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    return HOUR_OF_DAY1;
918adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                }
919adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
92003c0a8e681c776fdba0389ab8593282139afc6d6Elliott Hughes            throw new InvalidObjectException("Unknown attribute");
921adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
922adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
923adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
924adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private static void checkDateStyle(int style) {
925adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (!(style == SHORT || style == MEDIUM || style == LONG
926adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                || style == FULL || style == DEFAULT)) {
92703c0a8e681c776fdba0389ab8593282139afc6d6Elliott Hughes            throw new IllegalArgumentException("Illegal date style " + style);
928adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
929adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
930adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
931adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private static void checkTimeStyle(int style) {
932adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (!(style == SHORT || style == MEDIUM || style == LONG
933adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                || style == FULL || style == DEFAULT)) {
93403c0a8e681c776fdba0389ab8593282139afc6d6Elliott Hughes            throw new IllegalArgumentException("Illegal time style " + style);
935adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
936adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
937adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project}
938