HttpDateTime.java revision 5101c2b1f1a90a28271a11446ff78b235f287c45
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License. 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.webkit; 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.text.format.Time; 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Calendar; 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.regex.Matcher; 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.regex.Pattern; 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 26ee756b3d024b36f9b004598f3b892ed8d4887a0eDan Egnor/** {@hide} */ 27ee756b3d024b36f9b004598f3b892ed8d4887a0eDan Egnorpublic final class HttpDateTime { 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Regular expression for parsing HTTP-date. 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Wdy, DD Mon YYYY HH:MM:SS GMT 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * RFC 822, updated by RFC 1123 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Weekday, DD-Mon-YY HH:MM:SS GMT 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * RFC 850, obsoleted by RFC 1036 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Wdy Mon DD HH:MM:SS YYYY 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * ANSI C's asctime() format 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * with following variations 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Wdy, DD-Mon-YYYY HH:MM:SS GMT 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Wdy, (SP)D Mon YYYY HH:MM:SS GMT 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Wdy,DD Mon YYYY HH:MM:SS GMT 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Wdy, DD-Mon-YY HH:MM:SS GMT 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Wdy, DD Mon YYYY HH:MM:SS -HHMM 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Wdy, DD Mon YYYY HH:MM:SS 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Wdy Mon (SP)D HH:MM:SS YYYY 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Wdy Mon DD HH:MM:SS YYYY GMT 517b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project * 527b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project * HH can be H if the first digit is zero. 535101c2b1f1a90a28271a11446ff78b235f287c45Grace Kloba * 545101c2b1f1a90a28271a11446ff78b235f287c45Grace Kloba * Mon can be the full name of the month. 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final String HTTP_DATE_RFC_REGEXP = 575101c2b1f1a90a28271a11446ff78b235f287c45Grace Kloba "([0-9]{1,2})[- ]([A-Za-z]{3,9})[- ]([0-9]{2,4})[ ]" 587b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project + "([0-9]{1,2}:[0-9][0-9]:[0-9][0-9])"; 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final String HTTP_DATE_ANSIC_REGEXP = 615101c2b1f1a90a28271a11446ff78b235f287c45Grace Kloba "[ ]([A-Za-z]{3,9})[ ]+([0-9]{1,2})[ ]" 627b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project + "([0-9]{1,2}:[0-9][0-9]:[0-9][0-9])[ ]([0-9]{2,4})"; 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The compiled version of the HTTP-date regular expressions. 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final Pattern HTTP_DATE_RFC_PATTERN = 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Pattern.compile(HTTP_DATE_RFC_REGEXP); 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final Pattern HTTP_DATE_ANSIC_PATTERN = 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Pattern.compile(HTTP_DATE_ANSIC_REGEXP); 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static class TimeOfDay { 737b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project TimeOfDay(int h, int m, int s) { 747b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project this.hour = h; 757b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project this.minute = m; 767b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project this.second = s; 777b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project } 787b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int hour; 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int minute; 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int second; 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static Long parse(String timeString) 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws IllegalArgumentException { 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int date = 1; 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int month = Calendar.JANUARY; 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int year = 1970; 907b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project TimeOfDay timeOfDay; 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Matcher rfcMatcher = HTTP_DATE_RFC_PATTERN.matcher(timeString); 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (rfcMatcher.find()) { 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project date = getDate(rfcMatcher.group(1)); 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project month = getMonth(rfcMatcher.group(2)); 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project year = getYear(rfcMatcher.group(3)); 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project timeOfDay = getTime(rfcMatcher.group(4)); 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Matcher ansicMatcher = HTTP_DATE_ANSIC_PATTERN.matcher(timeString); 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (ansicMatcher.find()) { 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project month = getMonth(ansicMatcher.group(1)); 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project date = getDate(ansicMatcher.group(2)); 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project timeOfDay = getTime(ansicMatcher.group(3)); 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project year = getYear(ansicMatcher.group(4)); 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IllegalArgumentException(); 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // FIXME: Y2038 BUG! 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (year >= 2038) { 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project year = 2038; 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project month = Calendar.JANUARY; 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project date = 1; 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Time time = new Time(Time.TIMEZONE_UTC); 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project time.set(timeOfDay.second, timeOfDay.minute, timeOfDay.hour, date, 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project month, year); 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return time.toMillis(false /* use isDst */); 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static int getDate(String dateString) { 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (dateString.length() == 2) { 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (dateString.charAt(0) - '0') * 10 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + (dateString.charAt(1) - '0'); 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (dateString.charAt(0) - '0'); 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * jan = 9 + 0 + 13 = 22 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * feb = 5 + 4 + 1 = 10 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * mar = 12 + 0 + 17 = 29 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * apr = 0 + 15 + 17 = 32 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * may = 12 + 0 + 24 = 36 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * jun = 9 + 20 + 13 = 42 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * jul = 9 + 20 + 11 = 40 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * aug = 0 + 20 + 6 = 26 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * sep = 18 + 4 + 15 = 37 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * oct = 14 + 2 + 19 = 35 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * nov = 13 + 14 + 21 = 48 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * dec = 3 + 4 + 2 = 9 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static int getMonth(String monthString) { 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int hash = Character.toLowerCase(monthString.charAt(0)) + 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Character.toLowerCase(monthString.charAt(1)) + 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Character.toLowerCase(monthString.charAt(2)) - 3 * 'a'; 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (hash) { 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case 22: 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return Calendar.JANUARY; 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case 10: 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return Calendar.FEBRUARY; 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case 29: 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return Calendar.MARCH; 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case 32: 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return Calendar.APRIL; 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case 36: 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return Calendar.MAY; 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case 42: 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return Calendar.JUNE; 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case 40: 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return Calendar.JULY; 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case 26: 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return Calendar.AUGUST; 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case 37: 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return Calendar.SEPTEMBER; 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case 35: 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return Calendar.OCTOBER; 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case 48: 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return Calendar.NOVEMBER; 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case 9: 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return Calendar.DECEMBER; 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project default: 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IllegalArgumentException(); 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static int getYear(String yearString) { 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (yearString.length() == 2) { 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int year = (yearString.charAt(0) - '0') * 10 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + (yearString.charAt(1) - '0'); 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (year >= 70) { 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return year + 1900; 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return year + 2000; 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 189d421995fdb490c687d27b56aa89bc83afc7c3d06Ben Murdoch } else if (yearString.length() == 3) { 190d421995fdb490c687d27b56aa89bc83afc7c3d06Ben Murdoch // According to RFC 2822, three digit years should be added to 1900. 191d421995fdb490c687d27b56aa89bc83afc7c3d06Ben Murdoch int year = (yearString.charAt(0) - '0') * 100 192d421995fdb490c687d27b56aa89bc83afc7c3d06Ben Murdoch + (yearString.charAt(1) - '0') * 10 193d421995fdb490c687d27b56aa89bc83afc7c3d06Ben Murdoch + (yearString.charAt(2) - '0'); 194d421995fdb490c687d27b56aa89bc83afc7c3d06Ben Murdoch return year + 1900; 195d421995fdb490c687d27b56aa89bc83afc7c3d06Ben Murdoch } else if (yearString.length() == 4) { 196d421995fdb490c687d27b56aa89bc83afc7c3d06Ben Murdoch return (yearString.charAt(0) - '0') * 1000 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + (yearString.charAt(1) - '0') * 100 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + (yearString.charAt(2) - '0') * 10 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + (yearString.charAt(3) - '0'); 200d421995fdb490c687d27b56aa89bc83afc7c3d06Ben Murdoch } else { 201d421995fdb490c687d27b56aa89bc83afc7c3d06Ben Murdoch return 1970; 202d421995fdb490c687d27b56aa89bc83afc7c3d06Ben Murdoch } 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static TimeOfDay getTime(String timeString) { 2067b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project // HH might be H 2077b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project int i = 0; 2087b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project int hour = timeString.charAt(i++) - '0'; 2097b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project if (timeString.charAt(i) != ':') 2107b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project hour = hour * 10 + (timeString.charAt(i++) - '0'); 2117b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project // Skip ':' 2127b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project i++; 2137b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project 2147b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project int minute = (timeString.charAt(i++) - '0') * 10 2157b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project + (timeString.charAt(i++) - '0'); 2167b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project // Skip ':' 2177b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project i++; 2187b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project 2197b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project int second = (timeString.charAt(i++) - '0') * 10 2207b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project + (timeString.charAt(i++) - '0'); 2217b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project 2227b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project return new TimeOfDay(hour, minute, second); 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 225