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