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 177cfa90fee54f44831ac492891d1c123601c2a262Jesse Wilsonpackage com.android.internal.http; 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 252269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackborn/** 262269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackborn * Helper for parsing an HTTP date. 272269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackborn */ 28ee756b3d024b36f9b004598f3b892ed8d4887a0eDan Egnorpublic final class HttpDateTime { 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Regular expression for parsing HTTP-date. 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Wdy, DD Mon YYYY HH:MM:SS GMT 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * RFC 822, updated by RFC 1123 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Weekday, DD-Mon-YY HH:MM:SS GMT 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * RFC 850, obsoleted by RFC 1036 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Wdy Mon DD HH:MM:SS YYYY 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * ANSI C's asctime() format 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * with following variations 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Wdy, DD-Mon-YYYY HH:MM:SS GMT 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Wdy, (SP)D Mon YYYY HH:MM:SS GMT 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Wdy,DD Mon YYYY HH:MM:SS GMT 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Wdy, DD-Mon-YY HH:MM:SS GMT 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Wdy, DD Mon YYYY HH:MM:SS -HHMM 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Wdy, DD Mon YYYY HH:MM:SS 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Wdy Mon (SP)D HH:MM:SS YYYY 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Wdy Mon DD HH:MM:SS YYYY GMT 527b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project * 537b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project * HH can be H if the first digit is zero. 545101c2b1f1a90a28271a11446ff78b235f287c45Grace Kloba * 555101c2b1f1a90a28271a11446ff78b235f287c45Grace Kloba * Mon can be the full name of the month. 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final String HTTP_DATE_RFC_REGEXP = 585101c2b1f1a90a28271a11446ff78b235f287c45Grace Kloba "([0-9]{1,2})[- ]([A-Za-z]{3,9})[- ]([0-9]{2,4})[ ]" 597b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project + "([0-9]{1,2}:[0-9][0-9]:[0-9][0-9])"; 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final String HTTP_DATE_ANSIC_REGEXP = 625101c2b1f1a90a28271a11446ff78b235f287c45Grace Kloba "[ ]([A-Za-z]{3,9})[ ]+([0-9]{1,2})[ ]" 637b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project + "([0-9]{1,2}:[0-9][0-9]:[0-9][0-9])[ ]([0-9]{2,4})"; 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The compiled version of the HTTP-date regular expressions. 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final Pattern HTTP_DATE_RFC_PATTERN = 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Pattern.compile(HTTP_DATE_RFC_REGEXP); 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final Pattern HTTP_DATE_ANSIC_PATTERN = 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Pattern.compile(HTTP_DATE_ANSIC_REGEXP); 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static class TimeOfDay { 747b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project TimeOfDay(int h, int m, int s) { 757b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project this.hour = h; 767b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project this.minute = m; 777b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project this.second = s; 787b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project } 797b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int hour; 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int minute; 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int second; 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 857cfa90fee54f44831ac492891d1c123601c2a262Jesse Wilson public static long parse(String timeString) 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws IllegalArgumentException { 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int date = 1; 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int month = Calendar.JANUARY; 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int year = 1970; 917b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project TimeOfDay timeOfDay; 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Matcher rfcMatcher = HTTP_DATE_RFC_PATTERN.matcher(timeString); 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (rfcMatcher.find()) { 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project date = getDate(rfcMatcher.group(1)); 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project month = getMonth(rfcMatcher.group(2)); 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project year = getYear(rfcMatcher.group(3)); 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project timeOfDay = getTime(rfcMatcher.group(4)); 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Matcher ansicMatcher = HTTP_DATE_ANSIC_PATTERN.matcher(timeString); 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (ansicMatcher.find()) { 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project month = getMonth(ansicMatcher.group(1)); 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project date = getDate(ansicMatcher.group(2)); 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project timeOfDay = getTime(ansicMatcher.group(3)); 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project year = getYear(ansicMatcher.group(4)); 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IllegalArgumentException(); 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // FIXME: Y2038 BUG! 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (year >= 2038) { 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project year = 2038; 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project month = Calendar.JANUARY; 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project date = 1; 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Time time = new Time(Time.TIMEZONE_UTC); 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project time.set(timeOfDay.second, timeOfDay.minute, timeOfDay.hour, date, 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project month, year); 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return time.toMillis(false /* use isDst */); 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static int getDate(String dateString) { 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (dateString.length() == 2) { 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (dateString.charAt(0) - '0') * 10 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + (dateString.charAt(1) - '0'); 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (dateString.charAt(0) - '0'); 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * jan = 9 + 0 + 13 = 22 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * feb = 5 + 4 + 1 = 10 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * mar = 12 + 0 + 17 = 29 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * apr = 0 + 15 + 17 = 32 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * may = 12 + 0 + 24 = 36 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * jun = 9 + 20 + 13 = 42 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * jul = 9 + 20 + 11 = 40 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * aug = 0 + 20 + 6 = 26 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * sep = 18 + 4 + 15 = 37 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * oct = 14 + 2 + 19 = 35 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * nov = 13 + 14 + 21 = 48 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * dec = 3 + 4 + 2 = 9 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static int getMonth(String monthString) { 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int hash = Character.toLowerCase(monthString.charAt(0)) + 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Character.toLowerCase(monthString.charAt(1)) + 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Character.toLowerCase(monthString.charAt(2)) - 3 * 'a'; 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (hash) { 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case 22: 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return Calendar.JANUARY; 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case 10: 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return Calendar.FEBRUARY; 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case 29: 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return Calendar.MARCH; 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case 32: 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return Calendar.APRIL; 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case 36: 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return Calendar.MAY; 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case 42: 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return Calendar.JUNE; 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case 40: 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return Calendar.JULY; 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case 26: 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return Calendar.AUGUST; 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case 37: 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return Calendar.SEPTEMBER; 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case 35: 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return Calendar.OCTOBER; 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case 48: 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return Calendar.NOVEMBER; 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case 9: 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return Calendar.DECEMBER; 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project default: 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IllegalArgumentException(); 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static int getYear(String yearString) { 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (yearString.length() == 2) { 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int year = (yearString.charAt(0) - '0') * 10 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + (yearString.charAt(1) - '0'); 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (year >= 70) { 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return year + 1900; 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return year + 2000; 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 190d421995fdb490c687d27b56aa89bc83afc7c3d06Ben Murdoch } else if (yearString.length() == 3) { 191d421995fdb490c687d27b56aa89bc83afc7c3d06Ben Murdoch // According to RFC 2822, three digit years should be added to 1900. 192d421995fdb490c687d27b56aa89bc83afc7c3d06Ben Murdoch int year = (yearString.charAt(0) - '0') * 100 193d421995fdb490c687d27b56aa89bc83afc7c3d06Ben Murdoch + (yearString.charAt(1) - '0') * 10 194d421995fdb490c687d27b56aa89bc83afc7c3d06Ben Murdoch + (yearString.charAt(2) - '0'); 195d421995fdb490c687d27b56aa89bc83afc7c3d06Ben Murdoch return year + 1900; 196d421995fdb490c687d27b56aa89bc83afc7c3d06Ben Murdoch } else if (yearString.length() == 4) { 197d421995fdb490c687d27b56aa89bc83afc7c3d06Ben Murdoch return (yearString.charAt(0) - '0') * 1000 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + (yearString.charAt(1) - '0') * 100 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + (yearString.charAt(2) - '0') * 10 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + (yearString.charAt(3) - '0'); 201d421995fdb490c687d27b56aa89bc83afc7c3d06Ben Murdoch } else { 202d421995fdb490c687d27b56aa89bc83afc7c3d06Ben Murdoch return 1970; 203d421995fdb490c687d27b56aa89bc83afc7c3d06Ben Murdoch } 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static TimeOfDay getTime(String timeString) { 2077b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project // HH might be H 2087b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project int i = 0; 2097b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project int hour = timeString.charAt(i++) - '0'; 2107b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project if (timeString.charAt(i) != ':') 2117b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project hour = hour * 10 + (timeString.charAt(i++) - '0'); 2127b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project // Skip ':' 2137b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project i++; 2147b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project 2157b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project int minute = (timeString.charAt(i++) - '0') * 10 2167b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project + (timeString.charAt(i++) - '0'); 2177b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project // Skip ':' 2187b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project i++; 2197b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project 2207b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project int second = (timeString.charAt(i++) - '0') * 10 2217b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project + (timeString.charAt(i++) - '0'); 2227b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project 2237b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project return new TimeOfDay(hour, minute, second); 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 226