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.sql;
19f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
20f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/**
21f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * A class which can consume and produce dates in SQL {@code Date} format.
22f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * <p>
23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Dates are represented in SQL as {@code yyyy-mm-dd}. Note that this date
24f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * format only deals with year, month and day values. There are no values for
25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * hours, minutes, seconds.
267ae5f6927b1b186bb54b94e7907cb245f0979fdeJesse Wilson * <p>
277ae5f6927b1b186bb54b94e7907cb245f0979fdeJesse Wilson * This is unlike the familiar {@code java.util.Date} object, which also includes
28f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * values for hours, minutes, seconds, and milliseconds.
29f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * <p>
30f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Time points are handled as millisecond values - milliseconds since the Epoch,
31f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * January 1st 1970, 00:00:00.000 GMT. Time values passed to the {@code
32f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * java.sql.Date} class are "normalized" to the time 00:00:00.000 GMT on the
33f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * date implied by the time value.
34f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
35f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpublic class Date extends java.util.Date {
36f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
37f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private static final long serialVersionUID = 1511598038487230103L;
38f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
39f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
40f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Constructs a {@code Date} object corresponding to the supplied year,
41f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * month and day.
427ae5f6927b1b186bb54b94e7907cb245f0979fdeJesse Wilson     *
437ae5f6927b1b186bb54b94e7907cb245f0979fdeJesse Wilson     * @deprecated Use the constructor {@link #Date(long)}.
44f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param theYear
45f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the year, specified as the year minus 1900. Must be in the
46f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            range {@code [0,8099]}.
47f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param theMonth
48f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the month, specified as a number with 0 = January. Must be in
49f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the range {@code [0,11]}.
50f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param theDay
51f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the day in the month. Must be in the range {@code [1,31]}.
52f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
53f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @Deprecated
54f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public Date(int theYear, int theMonth, int theDay) {
55f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        super(theYear, theMonth, theDay);
56f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
57f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
58f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
59f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Creates a date which corresponds to the day determined by the supplied
60f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * milliseconds time value {@code theDate}.
61f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
62f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param theDate
63f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            a time value in milliseconds since the epoch - January 1 1970
64f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            00:00:00 GMT. The time value (hours, minutes, seconds,
65f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            milliseconds) stored in the {@code Date} object is adjusted to
66f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            correspond to 00:00:00 GMT on the day determined by the supplied
67f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            time value.
68f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
69f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public Date(long theDate) {
70f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        super(normalizeTime(theDate));
71f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
72f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
73f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
74f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @deprecated This method is deprecated and must not be used. SQL {@code
75f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *             Date} values do not have an hours component.
76f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return does not return anything.
77f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @throws IllegalArgumentException
78f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *             if this method is called.
79f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
80f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @Deprecated
81f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @Override
82f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public int getHours() {
83f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        throw new IllegalArgumentException();
84f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
85f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
86f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
87f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @deprecated This method is deprecated and must not be used. SQL {@code
88f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *             Date} values do not have a minutes component.
89f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return does not return anything.
90f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @throws IllegalArgumentException
91f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *             if this method is called.
92f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
93f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @Deprecated
94f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @Override
95f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public int getMinutes() {
96f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        throw new IllegalArgumentException();
97f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
98f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
99f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @deprecated This method is deprecated and must not be used. SQL {@code
101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *             Date} values do not have a seconds component.
102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return does not return anything.
103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @throws IllegalArgumentException
104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *             if this method is called.
105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @Deprecated
107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @Override
108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public int getSeconds() {
109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        throw new IllegalArgumentException();
110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @deprecated This method is deprecated and must not be used. SQL {@code
114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *             Date} values do not have an hours component.
115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param theHours
116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the number of hours to set.
117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @throws IllegalArgumentException
118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *             if this method is called.
119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @Deprecated
121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @Override
122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void setHours(int theHours) {
123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        throw new IllegalArgumentException();
124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @deprecated This method is deprecated and must not be used. SQL {@code
128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *             Date} values do not have a minutes component.
129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param theMinutes
130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the number of minutes to set.
131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @throws IllegalArgumentException
132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *             if this method is called.
133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @Deprecated
135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @Override
136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void setMinutes(int theMinutes) {
137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        throw new IllegalArgumentException();
138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @deprecated This method is deprecated and must not be used. SQL {@code
142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *             Date} values do not have a seconds component.
143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param theSeconds
144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the number of seconds to set.
145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @throws IllegalArgumentException
146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *             if this method is called.
147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @Deprecated
149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @Override
150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void setSeconds(int theSeconds) {
151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        throw new IllegalArgumentException();
152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Sets this date to a date supplied as a milliseconds value. The date is
156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * set based on the supplied time value and rounded to zero GMT for that day.
157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param theTime
159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the time in milliseconds since the Epoch.
160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @Override
162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void setTime(long theTime) {
163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        /*
164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * Store the Date based on the supplied time after removing any time
165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * elements finer than the day based on zero GMT
166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         */
167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        super.setTime(normalizeTime(theTime));
168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Produces a string representation of the date in SQL format
172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return a string representation of the date in SQL format - {@code
174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *         "yyyy-mm-dd"}.
175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @Override
177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public String toString() {
1787ae5f6927b1b186bb54b94e7907cb245f0979fdeJesse Wilson        StringBuilder sb = new StringBuilder(10);
1797ae5f6927b1b186bb54b94e7907cb245f0979fdeJesse Wilson
1807ae5f6927b1b186bb54b94e7907cb245f0979fdeJesse Wilson        format((getYear() + 1900), 4, sb);
1817ae5f6927b1b186bb54b94e7907cb245f0979fdeJesse Wilson        sb.append('-');
1827ae5f6927b1b186bb54b94e7907cb245f0979fdeJesse Wilson        format((getMonth() + 1), 2, sb);
1837ae5f6927b1b186bb54b94e7907cb245f0979fdeJesse Wilson        sb.append('-');
1847ae5f6927b1b186bb54b94e7907cb245f0979fdeJesse Wilson        format(getDate(), 2, sb);
1857ae5f6927b1b186bb54b94e7907cb245f0979fdeJesse Wilson
1867ae5f6927b1b186bb54b94e7907cb245f0979fdeJesse Wilson        return sb.toString();
1877ae5f6927b1b186bb54b94e7907cb245f0979fdeJesse Wilson    }
1887ae5f6927b1b186bb54b94e7907cb245f0979fdeJesse Wilson
1897ae5f6927b1b186bb54b94e7907cb245f0979fdeJesse Wilson    private static final String PADDING = "0000";  //$NON-NLS-1$
1907ae5f6927b1b186bb54b94e7907cb245f0979fdeJesse Wilson
1917ae5f6927b1b186bb54b94e7907cb245f0979fdeJesse Wilson    /*
1927ae5f6927b1b186bb54b94e7907cb245f0979fdeJesse Wilson    * Private method to format the time
1937ae5f6927b1b186bb54b94e7907cb245f0979fdeJesse Wilson    */
1947ae5f6927b1b186bb54b94e7907cb245f0979fdeJesse Wilson    private void format(int date, int digits, StringBuilder sb) {
1957ae5f6927b1b186bb54b94e7907cb245f0979fdeJesse Wilson        String str = String.valueOf(date);
1967ae5f6927b1b186bb54b94e7907cb245f0979fdeJesse Wilson        if (digits - str.length() > 0) {
1977ae5f6927b1b186bb54b94e7907cb245f0979fdeJesse Wilson            sb.append(PADDING.substring(0, digits - str.length()));
1987ae5f6927b1b186bb54b94e7907cb245f0979fdeJesse Wilson        }
1997ae5f6927b1b186bb54b94e7907cb245f0979fdeJesse Wilson        sb.append(str);
200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
201f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Creates a {@code Date} from a string representation of a date in SQL
204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * format.
205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param dateString
207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the string representation of a date in SQL format - " {@code
208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            yyyy-mm-dd}".
209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return the {@code Date} object.
210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @throws IllegalArgumentException
211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *             if the format of the supplied string does not match the SQL
212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *             format.
213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static Date valueOf(String dateString) {
215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (dateString == null) {
216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throw new IllegalArgumentException();
217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        int firstIndex = dateString.indexOf('-');
219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        int secondIndex = dateString.indexOf('-', firstIndex + 1);
220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // secondIndex == -1 means none or only one separator '-' has been
221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // found.
222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // The string is separated into three parts by two separator characters,
223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // if the first or the third part is null string, we should throw
224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // IllegalArgumentException to follow RI
225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (secondIndex == -1 || firstIndex == 0
226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                || secondIndex + 1 == dateString.length()) {
227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throw new IllegalArgumentException();
228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // parse each part of the string
230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        int year = Integer.parseInt(dateString.substring(0, firstIndex));
231f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        int month = Integer.parseInt(dateString.substring(firstIndex + 1,
232f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                secondIndex));
233f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        int day = Integer.parseInt(dateString.substring(secondIndex + 1,
234f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                dateString.length()));
235f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return new Date(year - 1900, month - 1, day);
236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
238f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
239f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Private method which normalizes a Time value, removing all low
240f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * significance digits corresponding to milliseconds, seconds, minutes and
241f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * hours, so that the returned Time value corresponds to 00:00:00 GMT on a
242f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * particular day.
243f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
244f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private static long normalizeTime(long theTime) {
245f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return theTime;
246f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
247f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
248