1f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
2f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  Licensed to the Apache Software Foundation (ASF) under one or more
3f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  contributor license agreements.  See the NOTICE file distributed with
4f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  this work for additional information regarding copyright ownership.
5f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  The ASF licenses this file to You under the Apache License, Version 2.0
6f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  (the "License"); you may not use this file except in compliance with
7f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  the License.  You may obtain a copy of the License at
8f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
9f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *     http://www.apache.org/licenses/LICENSE-2.0
10f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
11f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  Unless required by applicable law or agreed to in writing, software
12f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  distributed under the License is distributed on an "AS IS" BASIS,
13f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  See the License for the specific language governing permissions and
15f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  limitations under the License.
16f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
17f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
18f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpackage java.util;
19f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
20f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.io.IOException;
21f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.io.ObjectInputStream;
22f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.io.ObjectOutputStream;
23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.io.Serializable;
24f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.text.DateFormat;
25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.text.DateFormatSymbols;
26f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.text.SimpleDateFormat;
27f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
28f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport org.apache.harmony.luni.internal.nls.Messages;
29f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
30f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/**
31f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * {@code Date} represents a specific moment in time, to the millisecond.
323819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson *
33f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @see System#currentTimeMillis
34f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @see Calendar
35f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @see GregorianCalendar
36f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @see SimpleTimeZone
37f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @see TimeZone
38f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
39f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpublic class Date implements Serializable, Cloneable, Comparable<Date> {
40f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
41f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private static final long serialVersionUID = 7523967970034938905L;
42f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
43f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    // Used by parse()
44f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private static int creationYear = new Date().getYear();
45f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
46f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private transient long milliseconds;
47f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
483819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson    private static String[] dayOfWeekNames = { "Sun", "Mon", "Tue", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
493819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson        "Wed", "Thu", "Fri", "Sat" }; //$NON-NLS-1$//$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
503819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson
513819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson    private static String[] monthNames = { "Jan", "Feb", "Mar", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
523819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson        "Apr", "May", "Jun", "Jul", //$NON-NLS-1$//$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
533819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson        "Aug", "Sep", "Oct", "Nov", "Dec"};  //$NON-NLS-1$//$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$
543819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson
55f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
568ee76d4d3ee58109f859964e56d5c7f3d8c566d9Elliott Hughes     * Initializes this {@code Date} instance to the current time.
57f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
58f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public Date() {
59f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        this(System.currentTimeMillis());
60f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
61f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
62f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
63f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Constructs a new {@code Date} initialized to midnight in the default {@code TimeZone} on
64f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * the specified date.
653819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *
66f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param year
67f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the year, 0 is 1900.
68f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param month
69f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the month, 0 - 11.
70f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param day
71f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the day of the month, 1 - 31.
723819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *
73f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @deprecated use
74f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *             {@link GregorianCalendar#GregorianCalendar(int, int, int)}
75f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
76f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @Deprecated
77f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public Date(int year, int month, int day) {
78f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        GregorianCalendar cal = new GregorianCalendar(false);
79f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        cal.set(1900 + year, month, day);
80f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        milliseconds = cal.getTimeInMillis();
81f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
82f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
83f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
84f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Constructs a new {@code Date} initialized to the specified date and time in the
85f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * default {@code TimeZone}.
863819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *
87f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param year
88f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the year, 0 is 1900.
89f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param month
90f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the month, 0 - 11.
91f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param day
92f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the day of the month, 1 - 31.
93f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param hour
94f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the hour of day, 0 - 23.
95f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param minute
96f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the minute of the hour, 0 - 59.
973819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *
98f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @deprecated use
99f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *             {@link GregorianCalendar#GregorianCalendar(int, int, int, int, int)}
100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @Deprecated
102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public Date(int year, int month, int day, int hour, int minute) {
103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        GregorianCalendar cal = new GregorianCalendar(false);
104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        cal.set(1900 + year, month, day, hour, minute);
105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        milliseconds = cal.getTimeInMillis();
106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Constructs a new {@code Date} initialized to the specified date and time in the
110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * default {@code TimeZone}.
1113819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *
112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param year
113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the year, 0 is 1900.
114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param month
115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the month, 0 - 11.
116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param day
117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the day of the month, 1 - 31.
118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param hour
119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the hour of day, 0 - 23.
120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param minute
121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the minute of the hour, 0 - 59.
122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param second
123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the second of the minute, 0 - 59.
1243819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *
125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @deprecated use
126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *             {@link GregorianCalendar#GregorianCalendar(int, int, int, int, int, int)}
127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @Deprecated
129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public Date(int year, int month, int day, int hour, int minute, int second) {
130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        GregorianCalendar cal = new GregorianCalendar(false);
131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        cal.set(1900 + year, month, day, hour, minute, second);
132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        milliseconds = cal.getTimeInMillis();
133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Initializes this {@code Date} instance using the specified millisecond value. The
137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * value is the number of milliseconds since Jan. 1, 1970 GMT.
1383819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *
139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param milliseconds
140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the number of milliseconds since Jan. 1, 1970 GMT.
141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public Date(long milliseconds) {
1433819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson        this.milliseconds = milliseconds;
144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Constructs a new {@code Date} initialized to the date and time parsed from the
148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specified String.
1493819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *
150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param string
151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the String to parse.
1523819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *
153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @deprecated use {@link DateFormat}
154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @Deprecated
156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public Date(String string) {
157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        milliseconds = parse(string);
158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Returns if this {@code Date} is after the specified Date.
1623819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *
163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param date
164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            a Date instance to compare.
165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return {@code true} if this {@code Date} is after the specified {@code Date},
166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *         {@code false} otherwise.
167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public boolean after(Date date) {
169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return milliseconds > date.milliseconds;
170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Returns if this {@code Date} is before the specified Date.
1743819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *
175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param date
176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            a {@code Date} instance to compare.
177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return {@code true} if this {@code Date} is before the specified {@code Date},
178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *         {@code false} otherwise.
179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public boolean before(Date date) {
181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return milliseconds < date.milliseconds;
182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Returns a new {@code Date} with the same millisecond value as this {@code Date}.
1863819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *
187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return a shallow copy of this {@code Date}.
1883819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *
189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @see java.lang.Cloneable
190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @Override
192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public Object clone() {
193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        try {
194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return super.clone();
195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } catch (CloneNotSupportedException e) {
196a0ebf91e58c17487a8bd1be6e64193193deae26fJesse Wilson            throw new AssertionError(e); // android-changed
197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
198f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
201f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Compare the receiver to the specified {@code Date} to determine the relative
202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * ordering.
2033819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *
204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param date
205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            a {@code Date} to compare against.
206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return an {@code int < 0} if this {@code Date} is less than the specified {@code Date}, {@code 0} if
207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *         they are equal, and an {@code int > 0} if this {@code Date} is greater.
208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public int compareTo(Date date) {
210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (milliseconds < date.milliseconds) {
211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return -1;
212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (milliseconds == date.milliseconds) {
214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return 0;
215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return 1;
217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Compares the specified object to this {@code Date} and returns if they are equal.
221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * To be equal, the object must be an instance of {@code Date} and have the same millisecond
222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * value.
2233819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *
224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param object
225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the object to compare with this object.
226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return {@code true} if the specified object is equal to this {@code Date}, {@code false}
227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *         otherwise.
2283819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *
229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @see #hashCode
230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
231f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @Override
232f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public boolean equals(Object object) {
233f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return (object == this) || (object instanceof Date)
234f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                && (milliseconds == ((Date) object).milliseconds);
235f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
238f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Returns the gregorian calendar day of the month for this {@code Date} object.
2393819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *
240f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return the day of the month.
2413819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *
242f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @deprecated use {@code Calendar.get(Calendar.DATE)}
243f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
244f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @Deprecated
245f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public int getDate() {
246f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return new GregorianCalendar(milliseconds).get(Calendar.DATE);
247f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
248f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
249f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
250f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Returns the gregorian calendar day of the week for this {@code Date} object.
2513819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *
252f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return the day of the week.
2533819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *
254f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @deprecated use {@code Calendar.get(Calendar.DAY_OF_WEEK)}
255f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
256f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @Deprecated
257f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public int getDay() {
258f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return new GregorianCalendar(milliseconds).get(Calendar.DAY_OF_WEEK) - 1;
259f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
260f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
261f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
262f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Returns the gregorian calendar hour of the day for this {@code Date} object.
2633819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *
264f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return the hour of the day.
2653819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *
266f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @deprecated use {@code Calendar.get(Calendar.HOUR_OF_DAY)}
267f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
268f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @Deprecated
269f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public int getHours() {
270f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return new GregorianCalendar(milliseconds).get(Calendar.HOUR_OF_DAY);
271f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
272f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
273f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
274f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Returns the gregorian calendar minute of the hour for this {@code Date} object.
2753819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *
276f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return the minutes.
2773819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *
278f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @deprecated use {@code Calendar.get(Calendar.MINUTE)}
279f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
280f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @Deprecated
281f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public int getMinutes() {
282f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return new GregorianCalendar(milliseconds).get(Calendar.MINUTE);
283f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
284f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
285f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
286f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Returns the gregorian calendar month for this {@code Date} object.
2873819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *
288f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return the month.
2893819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *
290f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @deprecated use {@code Calendar.get(Calendar.MONTH)}
291f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
292f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @Deprecated
293f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public int getMonth() {
294f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return new GregorianCalendar(milliseconds).get(Calendar.MONTH);
295f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
296f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
297f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
298f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Returns the gregorian calendar second of the minute for this {@code Date} object.
2993819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *
300f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return the seconds.
3013819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *
302f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @deprecated use {@code Calendar.get(Calendar.SECOND)}
303f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
304f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @Deprecated
305f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public int getSeconds() {
306f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return new GregorianCalendar(milliseconds).get(Calendar.SECOND);
307f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
308f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
309f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
310f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Returns this {@code Date} as a millisecond value. The value is the number of
311f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * milliseconds since Jan. 1, 1970, midnight GMT.
3123819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *
313f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return the number of milliseconds since Jan. 1, 1970, midnight GMT.
314f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
315f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public long getTime() {
316f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return milliseconds;
317f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
318f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
319f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
320f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Returns the timezone offset in minutes of the default {@code TimeZone}.
3213819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *
322f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return the timezone offset in minutes of the default {@code TimeZone}.
3233819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *
324f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @deprecated use
325f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *             {@code (Calendar.get(Calendar.ZONE_OFFSET) + Calendar.get(Calendar.DST_OFFSET)) / 60000}
326f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
327f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @Deprecated
328f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public int getTimezoneOffset() {
329f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        GregorianCalendar cal = new GregorianCalendar(milliseconds);
330f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return -(cal.get(Calendar.ZONE_OFFSET) + cal.get(Calendar.DST_OFFSET)) / 60000;
331f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
332f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
333f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
334f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Returns the gregorian calendar year since 1900 for this {@code Date} object.
3353819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *
336f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return the year - 1900.
3373819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *
338f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @deprecated use {@code Calendar.get(Calendar.YEAR) - 1900}
339f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
340f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @Deprecated
341f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public int getYear() {
342f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return new GregorianCalendar(milliseconds).get(Calendar.YEAR) - 1900;
343f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
344f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
345f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
346f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Returns an integer hash code for the receiver. Objects which are equal
347f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * return the same value for this method.
3483819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *
349f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return this {@code Date}'s hash.
3503819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *
351f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @see #equals
352f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
353f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @Override
354f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public int hashCode() {
355f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return (int) (milliseconds >>> 32) ^ (int) milliseconds;
356f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
357f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
358f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private static int parse(String string, String[] array) {
359f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        for (int i = 0, alength = array.length, slength = string.length(); i < alength; i++) {
360f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            if (string.regionMatches(true, 0, array[i], 0, slength)) {
361f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                return i;
362f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
363f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
364f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return -1;
365f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
366f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
367f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
368f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Returns the millisecond value of the date and time parsed from the
369f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specified {@code String}. Many date/time formats are recognized, including IETF
370f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * standard syntax, i.e. Tue, 22 Jun 1999 12:16:00 GMT-0500
3713819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *
372f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param string
373f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the String to parse.
374f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return the millisecond value parsed from the String.
3753819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *
376f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @deprecated use {@link DateFormat}
377f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
378f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @Deprecated
379f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static long parse(String string) {
380f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
381f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (string == null) {
382f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            // luni.06=The string argument is null
383f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throw new IllegalArgumentException(Messages.getString("luni.06")); //$NON-NLS-1$
384f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
385f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
386f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        char sign = 0;
387f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        int commentLevel = 0;
388f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        int offset = 0, length = string.length(), state = 0;
389f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        int year = -1, month = -1, date = -1;
3903819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson        int hour = -1, minute = -1, second = -1, zoneOffset = 0, minutesOffset = 0;
391f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        boolean zone = false;
392f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        final int PAD = 0, LETTERS = 1, NUMBERS = 2;
39301021fcb0c9026e81ac2c262caf5e2ec830a7025Jesse Wilson        StringBuilder buffer = new StringBuilder();
394f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
395f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        while (offset <= length) {
396f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            char next = offset < length ? string.charAt(offset) : '\r';
397f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            offset++;
398f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
399f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            if (next == '(') {
400f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                commentLevel++;
401f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
402f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            if (commentLevel > 0) {
403f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                if (next == ')') {
404f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    commentLevel--;
405f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
406f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                if (commentLevel == 0) {
407f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    next = ' ';
408f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                } else {
409f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    continue;
410f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
411f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
412f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
413f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            int nextState = PAD;
414f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            if ('a' <= next && next <= 'z' || 'A' <= next && next <= 'Z') {
415f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                nextState = LETTERS;
416f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            } else if ('0' <= next && next <= '9') {
417f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                nextState = NUMBERS;
418f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            } else if (!Character.isSpace(next) && ",+-:/".indexOf(next) == -1) { //$NON-NLS-1$
419f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                throw new IllegalArgumentException();
420f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
421f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
422f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            if (state == NUMBERS && nextState != NUMBERS) {
423f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                int digit = Integer.parseInt(buffer.toString());
424f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                buffer.setLength(0);
425f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                if (sign == '+' || sign == '-') {
426f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    if (zoneOffset == 0) {
427f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        zone = true;
4283819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson                        if (next == ':') {
4293819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson                            minutesOffset = sign == '-' ? -Integer
4303819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson                                    .parseInt(string.substring(offset,
4313819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson                                            offset + 2)) : Integer
4323819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson                                    .parseInt(string.substring(offset,
4333819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson                                            offset + 2));
4343819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson                            offset += 2;
4353819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson                        }
436f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        zoneOffset = sign == '-' ? -digit : digit;
437f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        sign = 0;
438f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    } else {
439f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        throw new IllegalArgumentException();
440f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    }
441f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                } else if (digit >= 70) {
442f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    if (year == -1
443f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                            && (Character.isSpace(next) || next == ','
444f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                                    || next == '/' || next == '\r')) {
445f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        year = digit;
446f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    } else {
447f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        throw new IllegalArgumentException();
448f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    }
449f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                } else if (next == ':') {
450f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    if (hour == -1) {
451f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        hour = digit;
452f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    } else if (minute == -1) {
453f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        minute = digit;
454f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    } else {
455f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        throw new IllegalArgumentException();
456f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    }
457f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                } else if (next == '/') {
458f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    if (month == -1) {
459f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        month = digit - 1;
460f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    } else if (date == -1) {
461f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        date = digit;
462f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    } else {
463f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        throw new IllegalArgumentException();
464f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    }
465f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                } else if (Character.isSpace(next) || next == ','
466f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        || next == '-' || next == '\r') {
467f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    if (hour != -1 && minute == -1) {
468f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        minute = digit;
469f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    } else if (minute != -1 && second == -1) {
470f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        second = digit;
471f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    } else if (date == -1) {
472f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        date = digit;
473f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    } else if (year == -1) {
474f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        year = digit;
475f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    } else {
476f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        throw new IllegalArgumentException();
477f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    }
478f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                } else if (year == -1 && month != -1 && date != -1) {
479f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    year = digit;
480f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                } else {
481f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    throw new IllegalArgumentException();
482f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
483f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            } else if (state == LETTERS && nextState != LETTERS) {
484f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                String text = buffer.toString().toUpperCase();
485f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                buffer.setLength(0);
486f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                if (text.length() == 1) {
487f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    throw new IllegalArgumentException();
488f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
489f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                if (text.equals("AM")) { //$NON-NLS-1$
490f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    if (hour == 12) {
491f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        hour = 0;
492f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    } else if (hour < 1 || hour > 12) {
493f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        throw new IllegalArgumentException();
494f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    }
495f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                } else if (text.equals("PM")) { //$NON-NLS-1$
496f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    if (hour == 12) {
497f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        hour = 0;
498f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    } else if (hour < 1 || hour > 12) {
499f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        throw new IllegalArgumentException();
500f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    }
501f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    hour += 12;
502f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                } else {
503f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    DateFormatSymbols symbols = new DateFormatSymbols(Locale.US);
504f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    String[] weekdays = symbols.getWeekdays(), months = symbols
505f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                            .getMonths();
506f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    int value;
507f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    if (parse(text, weekdays) != -1) {/* empty */
508f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    } else if (month == -1
509f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                            && (month = parse(text, months)) != -1) {/* empty */
510f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    } else if (text.equals("GMT") || text.equals("UT") //$NON-NLS-1$ //$NON-NLS-2$
511f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                            || text.equals("UTC")) { //$NON-NLS-1$
512f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        zone = true;
513f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        zoneOffset = 0;
514f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    } else if ((value = zone(text)) != 0) {
515f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        zone = true;
516f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        zoneOffset = value;
517f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    } else {
518f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        throw new IllegalArgumentException();
519f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    }
520f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
521f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
522f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
523f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            if (next == '+' || (year != -1 && next == '-')) {
524f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                sign = next;
525f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            } else if (!Character.isSpace(next) && next != ','
526f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    && nextState != NUMBERS) {
527f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                sign = 0;
528f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
529f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
530f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            if (nextState == LETTERS || nextState == NUMBERS) {
531f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                buffer.append(next);
532f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
533f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            state = nextState;
534f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
535f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
536f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (year != -1 && month != -1 && date != -1) {
537f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            if (hour == -1) {
538f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                hour = 0;
539f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
540f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            if (minute == -1) {
541f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                minute = 0;
542f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
543f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            if (second == -1) {
544f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                second = 0;
545f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
546f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            if (year < (creationYear - 80)) {
547f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                year += 2000;
548f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            } else if (year < 100) {
549f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                year += 1900;
550f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
5513819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson            minute -= minutesOffset;
552f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            if (zone) {
553f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                if (zoneOffset >= 24 || zoneOffset <= -24) {
554f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    hour -= zoneOffset / 100;
555f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    minute -= zoneOffset % 100;
556f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                } else {
557f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    hour -= zoneOffset;
558f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
559f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                return UTC(year - 1900, month, date, hour, minute, second);
560f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
561f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return new Date(year - 1900, month, date, hour, minute, second)
562f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    .getTime();
563f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
564f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        throw new IllegalArgumentException();
565f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
566f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
567f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
568f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Sets the gregorian calendar day of the month for this {@code Date} object.
5693819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *
570f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param day
571f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the day of the month.
5723819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *
573f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @deprecated use {@code Calendar.set(Calendar.DATE, day)}
574f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
575f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @Deprecated
576f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void setDate(int day) {
577f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        GregorianCalendar cal = new GregorianCalendar(milliseconds);
578f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        cal.set(Calendar.DATE, day);
579f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        milliseconds = cal.getTimeInMillis();
580f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
581f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
582f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
583f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Sets the gregorian calendar hour of the day for this {@code Date} object.
5843819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *
585f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param hour
586f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the hour of the day.
5873819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *
588f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @deprecated use {@code Calendar.set(Calendar.HOUR_OF_DAY, hour)}
589f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
590f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @Deprecated
591f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void setHours(int hour) {
592f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        GregorianCalendar cal = new GregorianCalendar(milliseconds);
593f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        cal.set(Calendar.HOUR_OF_DAY, hour);
594f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        milliseconds = cal.getTimeInMillis();
595f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
596f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
597f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
598f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Sets the gregorian calendar minute of the hour for this {@code Date} object.
5993819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *
600f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param minute
601f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the minutes.
6023819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *
603f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @deprecated use {@code Calendar.set(Calendar.MINUTE, minute)}
604f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
605f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @Deprecated
606f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void setMinutes(int minute) {
607f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        GregorianCalendar cal = new GregorianCalendar(milliseconds);
608f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        cal.set(Calendar.MINUTE, minute);
609f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        milliseconds = cal.getTimeInMillis();
610f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
611f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
612f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
613f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Sets the gregorian calendar month for this {@code Date} object.
6143819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *
615f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param month
616f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the month.
6173819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *
618f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @deprecated use {@code Calendar.set(Calendar.MONTH, month)}
619f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
620f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @Deprecated
621f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void setMonth(int month) {
622f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        GregorianCalendar cal = new GregorianCalendar(milliseconds);
623f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        cal.set(Calendar.MONTH, month);
624f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        milliseconds = cal.getTimeInMillis();
625f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
626f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
627f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
628f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Sets the gregorian calendar second of the minute for this {@code Date} object.
6293819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *
630f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param second
631f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the seconds.
6323819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *
633f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @deprecated use {@code Calendar.set(Calendar.SECOND, second)}
634f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
635f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @Deprecated
636f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void setSeconds(int second) {
637f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        GregorianCalendar cal = new GregorianCalendar(milliseconds);
638f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        cal.set(Calendar.SECOND, second);
639f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        milliseconds = cal.getTimeInMillis();
640f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
641f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
642f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
643f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Sets this {@code Date} to the specified millisecond value. The value is the
644f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * number of milliseconds since Jan. 1, 1970 GMT.
6453819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *
646f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param milliseconds
647f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the number of milliseconds since Jan. 1, 1970 GMT.
648f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
649f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void setTime(long milliseconds) {
650f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        this.milliseconds = milliseconds;
651f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
652f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
653f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
654f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Sets the gregorian calendar year since 1900 for this {@code Date} object.
6553819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *
656f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param year
657f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the year since 1900.
6583819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *
659f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @deprecated use {@code Calendar.set(Calendar.YEAR, year + 1900)}
660f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
661f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @Deprecated
662f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void setYear(int year) {
663f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        GregorianCalendar cal = new GregorianCalendar(milliseconds);
664f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        cal.set(Calendar.YEAR, year + 1900);
665f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        milliseconds = cal.getTimeInMillis();
666f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
667f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
668f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
669f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Returns the string representation of this {@code Date} in GMT in the format: 22
670f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Jun 1999 13:02:00 GMT
6713819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *
672f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return the string representation of this {@code Date} in GMT.
6733819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *
674f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @deprecated use {@link DateFormat}
675f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
676f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @Deprecated
677f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public String toGMTString() {
6788ee76d4d3ee58109f859964e56d5c7f3d8c566d9Elliott Hughes        // TODO: why does this insert the year manually instead of using one SimpleDateFormat?
679f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        SimpleDateFormat format1 = new SimpleDateFormat("d MMM ", Locale.US); //$NON-NLS-1$
680f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        SimpleDateFormat format2 = new SimpleDateFormat(
681f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                " HH:mm:ss 'GMT'", Locale.US); //$NON-NLS-1$
682f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        TimeZone gmtZone = TimeZone.getTimeZone("GMT"); //$NON-NLS-1$
683f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        format1.setTimeZone(gmtZone);
684f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        format2.setTimeZone(gmtZone);
685f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        GregorianCalendar gc = new GregorianCalendar(gmtZone);
686f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        gc.setTimeInMillis(milliseconds);
687f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return format1.format(this) + gc.get(Calendar.YEAR)
688f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                + format2.format(this);
689f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
690f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
691f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
692f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Returns the string representation of this {@code Date} for the default {@code Locale}.
6933819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *
694f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return the string representation of this {@code Date} for the default {@code Locale}.
6953819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *
696f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @deprecated use {@link DateFormat}
697f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
698f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @Deprecated
699f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public String toLocaleString() {
700f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return DateFormat.getDateTimeInstance().format(this);
701f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
702f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
703f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
7048ee76d4d3ee58109f859964e56d5c7f3d8c566d9Elliott Hughes     * Returns a string representation of this {@code Date}.
7058ee76d4d3ee58109f859964e56d5c7f3d8c566d9Elliott Hughes     * The formatting is equivalent to using a {@code SimpleDateFormat} with
7068ee76d4d3ee58109f859964e56d5c7f3d8c566d9Elliott Hughes     * the format string "EEE MMM dd HH:mm:ss zzz yyyy", which looks something
7078ee76d4d3ee58109f859964e56d5c7f3d8c566d9Elliott Hughes     * like "Tue Jun 22 13:07:00 PDT 1999". The current default time zone and
7088ee76d4d3ee58109f859964e56d5c7f3d8c566d9Elliott Hughes     * locale are used. If you need control over the time zone or locale,
7098ee76d4d3ee58109f859964e56d5c7f3d8c566d9Elliott Hughes     * use {@code SimpleDateFormat} instead.
7103819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *
711f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return the string representation of this {@code Date}.
712f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
713f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @Override
714f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public String toString() {
7158ee76d4d3ee58109f859964e56d5c7f3d8c566d9Elliott Hughes        // BEGIN android-changed: fixed to use time zone display names ("PST")
7168ee76d4d3ee58109f859964e56d5c7f3d8c566d9Elliott Hughes        // rather than ids ("America/Los_Angeles").
7178ee76d4d3ee58109f859964e56d5c7f3d8c566d9Elliott Hughes        // Equivalent to the following one-liner, though that's currently 8x slower
7188ee76d4d3ee58109f859964e56d5c7f3d8c566d9Elliott Hughes        // at 1655us versus 195us...
7198ee76d4d3ee58109f859964e56d5c7f3d8c566d9Elliott Hughes        //   return new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy").format(d);
7203819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson        Calendar cal = new GregorianCalendar(milliseconds);
7218ee76d4d3ee58109f859964e56d5c7f3d8c566d9Elliott Hughes        TimeZone tz = cal.getTimeZone();
7223819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson        return dayOfWeekNames[cal.get(Calendar.DAY_OF_WEEK) - 1] + " " + monthNames[cal.get(Calendar.MONTH)]//$NON-NLS-1$
7233819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson                + " " + toTwoDigits(cal.get(Calendar.DAY_OF_MONTH)) + " " + toTwoDigits(cal.get(Calendar.HOUR_OF_DAY))//$NON-NLS-1$ //$NON-NLS-2$
7243819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson                + ":" + toTwoDigits(cal.get(Calendar.MINUTE)) + ":" + toTwoDigits(cal.get(Calendar.SECOND))//$NON-NLS-1$ //$NON-NLS-2$
7258ee76d4d3ee58109f859964e56d5c7f3d8c566d9Elliott Hughes                + " " + tz.getDisplayName(tz.inDaylightTime(this), TimeZone.SHORT) + " " + cal.get(Calendar.YEAR);//$NON-NLS-1$ //$NON-NLS-2$
7268ee76d4d3ee58109f859964e56d5c7f3d8c566d9Elliott Hughes        // END android-changed
7273819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson    }
7283819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson
729369a8d273180de03122c1b90a0949ce7b52427baElliott Hughes    private String toTwoDigits(int n) {
730369a8d273180de03122c1b90a0949ce7b52427baElliott Hughes        if (n >= 10) {
731369a8d273180de03122c1b90a0949ce7b52427baElliott Hughes            return Integer.toString(n);//$NON-NLS-1$
7323819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson        } else {
733369a8d273180de03122c1b90a0949ce7b52427baElliott Hughes            return "0" + n;//$NON-NLS-1$
7343819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson        }
735f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
736f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
737f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
738f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Returns the millisecond value of the specified date and time in GMT.
7393819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *
740f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param year
741f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the year, 0 is 1900.
742f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param month
743f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the month, 0 - 11.
744f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param day
745f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the day of the month, 1 - 31.
746f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param hour
747f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the hour of day, 0 - 23.
748f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param minute
749f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the minute of the hour, 0 - 59.
750f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param second
751f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the second of the minute, 0 - 59.
752f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return the date and time in GMT in milliseconds.
7533819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *
754f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @deprecated use: <code>
755f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  Calendar cal = new GregorianCalendar(TimeZone.getTimeZone("GMT"));
756f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  cal.set(year + 1900, month, day, hour, minute, second);
757f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  cal.getTime().getTime();</code>
758f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
759f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @Deprecated
760f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static long UTC(int year, int month, int day, int hour, int minute,
761f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            int second) {
762f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        GregorianCalendar cal = new GregorianCalendar(false);
763f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        cal.setTimeZone(TimeZone.getTimeZone("GMT")); //$NON-NLS-1$
764f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        cal.set(1900 + year, month, day, hour, minute, second);
765f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return cal.getTimeInMillis();
766f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
767f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
768f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private static int zone(String text) {
769f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (text.equals("EST")) { //$NON-NLS-1$
770f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return -5;
771f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
772f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (text.equals("EDT")) { //$NON-NLS-1$
773f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return -4;
774f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
775f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (text.equals("CST")) { //$NON-NLS-1$
776f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return -6;
777f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
778f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (text.equals("CDT")) { //$NON-NLS-1$
779f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return -5;
780f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
781f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (text.equals("MST")) { //$NON-NLS-1$
782f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return -7;
783f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
784f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (text.equals("MDT")) { //$NON-NLS-1$
785f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return -6;
786f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
787f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (text.equals("PST")) { //$NON-NLS-1$
788f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return -8;
789f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
790f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (text.equals("PDT")) { //$NON-NLS-1$
791f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return -7;
792f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
793f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return 0;
794f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
795f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
796f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private void writeObject(ObjectOutputStream stream) throws IOException {
797f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        stream.defaultWriteObject();
798f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        stream.writeLong(getTime());
799f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
800f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
801f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private void readObject(ObjectInputStream stream) throws IOException,
802f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            ClassNotFoundException {
803f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        stream.defaultReadObject();
804f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        setTime(stream.readLong());
805f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
806f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
807